【问题标题】:Pivot dynamic column透视动态列
【发布时间】:2013-02-13 05:52:17
【问题描述】:

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

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 是动态列,需要旋转。

我需要旋转上表以获得以下结果

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

请帮忙。

谢谢。

【问题讨论】:

标签: sql pivot


【解决方案1】:

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

为了获得结果,您需要同时使用UNPIVOTPIVOT 函数。 unpivot 将采用TCountCount 列并将它们转换为行,然后PIVOT 将采用dates 并将它们转换为列。

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

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 |

【讨论】:

  • 为什么,哦,为什么,微软不能给我们真正的动态旋转?布莱尔格。
  • @ErikE 发生这种情况时我会高兴得跳起来。
  • 这可能是由于复杂的引擎内部结构,如果没有来自神的智慧,普通人无法理解。
  • 不,这是由于关系理论,其中给定查询结果集中的列是固定的。在匹配行中找到的值不能神奇地添加列。关系理论被广泛理解,没有神圣的干预。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2012-08-12
  • 2013-01-25
  • 2018-04-01
  • 1970-01-01
相关资源
最近更新 更多