【问题标题】:PIVOT SQL with Group By具有分组依据的 PIVOT SQL
【发布时间】:2020-06-09 21:27:33
【问题描述】:

我有下表:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      相关资源
      最近更新 更多