PIVOT SQL 与分组依据

PIVOT SQL with Group By

我有以下 table:

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

我怎样才能做到这一点?

要从 PIVOT 列中获取精确值,请使用 MAX 聚合函数。 此外,您需要格式化 dateof 以根据需要获取列的格式化名称。您可以根据需要定义任何日期时间格式。查看更多格式选项 here.

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);