At first, I recommend not using variable concatenation to create a list of columns. This behavior is undefined and may be unexpected . Instead, use the SQL Server XML extensions:
SET @Columns = (SELECT N', p.' + QUOTENAME(p.Att_Date)
FROM dbo.ATTENDANCE_MASTER AS p
GROUP BY p.ATT_DATE
ORDER BY p.ATT_DATE
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)');
@Columns , :
', Total = ' + STUFF(REPLACE(@columns, ', p.[', ' + p.['), 1, 3, '')
- :
, Total = p.[2015-08-01] + p.[2015-08-02]
SQL, :
IF OBJECT_ID(N'tempdb..
CREATE TABLE
INSERT INTO
VALUES
(1, 1, '2015-08-01 00:00:00', 1),
(2, 2, '2015-08-01 00:00:00', 0),
(3, 3, '2015-08-01 00:00:00', 1),
(4, 1, '2015-08-02 00:00:00', 0),
(5, 2, '2015-08-02 00:00:00', 1),
(6, 3, '2015-08-02 00:00:00', 1);
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @Columns = (SELECT N', p.' + QUOTENAME(REPLACE(CONVERT(VARCHAR(10), p.Att_Date, 111), '/', '-'))
FROM
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, '') + '
FROM
(
SELECT p.ATT_DATE, p.Stud_id, p.PRESENT FROM #T AS p
) AS j
PIVOT
(
SUM(PRESENT) FOR ATT_DATE IN ('+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;