选择列名称的日期值

时间:2018-02-05 20:37:48

标签: sql-server tsql rows

我有一张这样的表

item  value   date
-----------------------
a      8.9    20170101
b     10.3    20170114
a      3.4    20170111
c     13.4    20170121
b      8.3    20170111
b      1.0    20170312

我想运行一些选择让它像这样显示

    20170101      20170111    20170114   20170121  20170312
a     8.9            3.4
b                    8.3         10.3                  1.0
c                                            13.4

这在T-SQL中是否可行?

迪安-O

1 个答案:

答案 0 :(得分:2)

这可以使用数据透视表来完成。

如果您知道可以使用的所有日期:

select * from(select item,value,date from pivotExample) ot
pivot(sum(value) for date in ([20170101],[20170111],[20170114],[20170121],[20170312])) pt

如果您不知道日期,可以使用以下方式动态生成:

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

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

set @query = 'SELECT item,' + @cols + ' from 
         (
            select item,value,date
            from pivotExample
        ) x
        pivot 
        (
            sum(value)
            for date in (' + @cols + ')
        ) p '

execute(@query);