PIVOT SQL с группой по - PullRequest
       9

PIVOT SQL с группой по

1 голос
/ 26 февраля 2020

У меня есть следующая таблица:

groupof    dateof                 statusof
A          2020-01-01 00:00:00    YES
A          2020-02-01 00:00:00    NO
A          2020-03-01 00:00:00    YES
B          2020-01-01 00:00:00    YES

Затем у меня следующий запрос:

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);

select @cols = STUFF((SELECT ',' + QUOTENAME(dateof) from Table1 group by dateof order by dateof
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')

set @query = 'SELECT groupof,' + @cols + ' from 
             (select groupof, dateof, statusof from Table1) x
             pivot 
             (count(statusof) for dateof in (' + @cols + ')) p '

execute(@query);

Результат:

groupof   2020-01-01 00:00:00    2020-02-01 00:00:00    2020-03-01 00:00:00
A         1                      1                      1
B         1                      0                      0

Я хочу получить следующий результат:

groupof   2020-JAN     2020-FEB      2020-MAR
A         YES          NO            YES
B         YES          NULL          NULL

Как мне этого добиться?

1 Ответ

3 голосов
/ 26 февраля 2020

Чтобы получить точное значение из столбца PIVOT, используйте MAX статистическую функцию. Также вам нужно отформатировать dateof, чтобы получить отформатированное имя столбца, как вы хотите. Вы можете определить любой формат даты и времени, используя wi sh. Посмотрите больше вариантов формата здесь .

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);

select @cols = STUFF((SELECT ',' + QUOTENAME(FORMAT(dateof, 'yyyy-MMM')) from Table1 group by dateof order by dateof
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')

set @query = 'SELECT groupof,' + @cols + ' from 
             (select groupof, dateof, statusof from Table1) x
             pivot 
             (MAX(statusof) for dateof in (' + @cols + ')) p '

execute(@query);
...