Как сводить сгруппированные по таблице - PullRequest
0 голосов
/ 01 октября 2019

У меня есть таблица, которая выглядит следующим образом

myDate    myClass    myCount
1 Jan 17  A1         70
1 Jan 17  B2         60
1 Jan 17  C3         90
2 Jan 17  A1         50
2 Jan 17  B2         80
3 Jan 17  A1         20
3 Jan 17  C3         10

, которую я получил с помощью этого запроса

SELECT myDate, myClass, Count(*)
FROM myTable
GROUP BY myDate, myClass

Я хочу, чтобы таблица выглядела следующим образом

myDate    A1   B2   C3
1 Jan 17  70   60   90
2 Jan 17  50   80   0
3 Jan 17  20   0    10

Я могу сделать что-то вроде этого

SELECT myDate, 
SUM(CASE myClass WHEN 'A1' THEN 1 ELSE 0 END) AS A1,
SUM(CASE myClass WHEN 'B2' THEN 1 ELSE 0 END) AS B2,
SUM(CASE myClass WHEN 'C3' THEN 1 ELSE 0 END) AS C3
FROM myTable
GROUP BY myDate

, но у myClass могут быть новые классы, не ограничиваясь тремя классами, только он может вырасти до 200 классов.

1 Ответ

1 голос
/ 01 октября 2019

Вот решение generic, которое сгенерирует оператор Dynamic sql и вернет SUM записей PARTITIONED на GROUP BY Поля

SQL работает следующим образом:

    DECLARE @SQL NVARCHAR(MAX) = CONCAT (
        N'SELECT myDate, ',
        (
            SELECT STUFF((
                SELECT CONCAT (
                        N',SUM(CASE WHEN [myClass] = ''',
                        myClass,
                        N''' THEN myCount ELSE 0 END) AS [',
                        myClass,
                        N']'
                        )
                FROM myTable
                GROUP BY myClass
                FOR XML PATH('')
                ), 1, 1, '')
            ),
        N'FROM myTable GROUP BY myDate'
        )

EXEC sp_executesql @SQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...