透视动态列

时间:2013-02-12 21:43:03

标签: sql pivot

我有一个包含以下值的表格。

Date                     TCOUNT      COUNT
02/06/2013 00:00        3500        35
02/12/2013 00:00        4000        23
02/21/2013 00:00        1000        54
02/27/2013 00:00        5000        12

其中Date是动态col需要旋转。

我需要调整上表以获得以下结果

02/06/2013 00:00    02/12/2013 00:00    02/21/2013 00:00    02/27/2013 00:00
35                  23                  54                  12
3500                4000                1000                5000

请帮忙。

感谢。

1 个答案:

答案 0 :(得分:2)

基于你previous question was tagged with sql server的事实,我猜你需要sql server语法。

要获得结果,您需要同时使用UNPIVOTPIVOT函数。 unpivot会将TCountCount列转换为行,然后PIVOTdates转换为列。

如果您提前知道这些值,那么您可以对查询进行硬编码:

select *
from
(
  select date, value, col
  from yourtable
  unpivot
  (
    value
    for col in (tcount, count)
  ) unpiv
) src
pivot
(
  max(value)
  for date in ([2013-02-06], [2013-02-12], 
               [2013-02-21], [2013-02-27])
) piv;

请参阅SQL Fiddle with Demo

但是,如果您的日期数量未知,那么您将需要动态SQL:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(varchar(10), Date, 120)) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT col, ' + @cols + ' from 
             (
                select convert(varchar(10), Date, 120) date, 
                  value, col
                from yourtable
                unpivot
                (
                  value
                  for col in (tcount, count)
                ) unpiv
            ) src
            pivot 
            (
                max(value)
                for date in (' + @cols + ')
            ) p '

execute(@query)

请参阅SQL Fiddle with Demo

两者的结果是:

|    COL | 2013-02-06 | 2013-02-12 | 2013-02-21 | 2013-02-27 |
--------------------------------------------------------------
|  COUNT |         35 |         23 |         54 |         12 |
| TCOUNT |       3500 |       4000 |       1000 |       5000 |