2015-09-07 3 views
4

У меня есть динамический запрос PIVOT, в котором столбцы динамически генерируются.SUM динамических столбцов в таблице PIVOT в SQL Server

Мой стол: ATTENDANCE_MASTER Содержит: ID, Stud_id, ATT_DATE, НАСТОЯЩЕЕ

, которая хранит данные, такие как:

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 

я создал PIVOT Query

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); 

SET @columns = N''; 
SELECT @columns += N', p.' + QUOTENAME(ATT_DATE) 
    FROM (SELECT p.ATT_DATE FROM dbo.ATTENDANCE_MASTER AS p 
    GROUP BY p.ATT_DATE) AS x; 

SET @sql = N'SELECT Stud_id, ' + STUFF(@columns, 1, 2, '') + ' 
FROM 
(
    SELECT p.ATT_DATE, p.Stud_id, p.PRESENT FROM dbo.ATTENDANCE_MASTER 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; 

мне нужна сумма колонны, такие как

Stud_ID 2015-08-01 2015-08-2 2015-08-3 Total 
1   1   0   1  2 
2   1   1   1  3 
3   1   1   0  2 
4   0   0   1  1 

Пожалуйста, предложите мне решение.

Спасибо заранее.

+0

Я знаю, как сделать сумму статических столбцов, но я не знаю, как суммировать динамические столбцы – QuaBizIT

+0

Какой результат у вас есть? –

+0

Что здесь динамично? количество столбцов даты? –

ответ

1

Я бы в первую очередь рекомендую не использовать переменные конкатенации для создания списка столбцов. It's behaviour is undefined and can be unexpected. Вместо того, чтобы использовать расширения XML в SQL Server:

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..#T', 'U') IS NOT NULL DROP TABLE #T; 
CREATE TABLE #T ([ID] int, [Stud_id] int, [ATT_DATE] datetime, [PRESENT] int); 

INSERT INTO #T ([ID], [Stud_id], [ATT_DATE], [PRESENT]) 
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 #T 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, '') + ' 
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; 
+0

Спасибо, он работает .. – QuaBizIT

+0

У меня есть еще один запрос. Как я могу использовать две совокупные функции в этом, например Sum и Count. – QuaBizIT

1

Вы можете добавить GROUP BY WITH CUBE получить всего в следующем:

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); 

SET @columns = N''; 
SELECT @columns += N', p.' + QUOTENAME(ATT_DATE) 
    FROM (SELECT p.ATT_DATE FROM dbo.ATTENDANCE_MASTER AS p 
    GROUP BY p.ATT_DATE) AS x; 

SET @sql = N'SELECT Stud_id, ' + STUFF(@columns, 1, 2, '') + ' 
FROM 
(
    SELECT p.ATT_DATE, p.Stud_id, p.PRESENT 
    FROM dbo.ATTENDANCE_MASTER AS p 
    GROUP BY p.ATT_DATE, p.Stud_id, p.PRESENT 
    WITH CUBE 
) AS j 
PIVOT 
(
    SUM(PRESENT) FOR ATT_DATE IN ('+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ') 
) AS p;'; 
PRINT @sql; 
EXEC sp_executesql @sql; 

 Смежные вопросы

  • Нет связанных вопросов^_^