I have a Dynamic PIVOT query in which Columns are dynamically generated.
My table: ATTENDANCE_MASTER Contains: ID, Stud_id, ATT_DATE, PRESENT
which stores data like:
ID Stud_id ATT_DATE PRESENT
1 1 2015-08-1 1
2 2 2015-08-1 0
3 3 2015-08-1 1
4 1 2015-08-2 0
5 2 2015-08-2 1
6 3 2015-08-2 1
I need result like this
Stud_ID 2015-08-01 2015-08-2 2015-08-3 Total Count
1 1 0 1 2 3
2 1 1 1 3 3
3 1 1 0 2 3
4 0 0 1 1 3
I have created PIVOT Query
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX),@columns1 NVARCHAR(MAX);
SELECT @columns = N'',@columns1 =N'';
SET @Columns = (SELECT N', p.' + QUOTENAME(REPLACE(CONVERT(VARCHAR(10), p.Att_Date, 111), '/', '-'))
FROM ATTENDANCE_MASTER AS p
GROUP BY p.ATT_DATE
ORDER BY p.ATT_DATE
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)');
SET @sql = N'SELECT Stud_id, ' + STUFF(@columns, 1, 2, '') + ', Total = ' + STUFF(REPLACE(@columns, ', p.[', ' + p.['), 1, 3, '') + '
, Outof = ' + STUFF(REPLACE(@columns1, ', p1.[', ' + p1.['), 1, 4, '') + '
FROM
(
SELECT p.ATT_DATE, p.Stud_id, p.PRESENT FROM ATTENDANCE_MASTER AS p
) AS j
PIVOT
(
SUM(PRESENT) FOR ATT_DATE IN ('+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ')
) AS p;
PIVOT
(
Count(PRESENT) FOR ATT_DATE IN ('+ STUFF(REPLACE(@columns1, ', p1.[', ',['), 1, 1, '') + ')
) AS p1;';
PRINT @sql;
EXEC sp_executesql @sql;
I tried lot, but there is no solutions. Can I use two aggregate functions in this query? Please suggest me solution.
Thanks in advance.
You can achieve this using Common Table Expression. For example your table is
And Values
query for get ATT_DATE Value In single String
Here insert MIn() fun to every ATT_Date Value
MAIN DYNAMIC QUERY WITH PIVOT
Finally Use CTE merge Pivot query with [DAYS OF PRESENT] and [Total Days]
Here My Fiddle Sample: Dynamic_String With Pivot