【问题标题】:SQL Pivot Table isn't workingSQL 数据透视表不工作
【发布时间】:2012-07-07 09:44:14
【问题描述】:

SQL 2005

我有一个临时表:

 Year         PercentMale   PercentFemale  PercentHmlss   PercentEmployed  TotalSrvd
 2008           100                0           0              100              1
 2009           55                40           0               80             20
 2010           64                35           0               67            162
 2011           69                27           0               34            285
 2012           56                43          10                1             58

我想创建一个查询来显示这样的数据:

                    2008    2009    2010    2011    2012
 PercentMale         100     55      64      69      56 
 PercentFemale        -      40      35      27      43 
 PercentHmlss         -      -       -       -       10 
 PercentEmployed     100     80      67      34      1 
 TotalSrvd            1      20     162     285      58 

我可以使用数据透视表来完成此操作吗?如果是这样,怎么做?我试过使用支点,但没有成功。

 select PercentHmlss,PercentMale,Percentfemale,
     PercentEmployed,[2008],[2009],[2010],[2011],[2012] from 

 (select PercentHmlss,PercentMale, Percentfemale, PercentEmployed,
     TotalSrvd,year from @TempTable)as T

  pivot (sum (TotalSrvd) for year 
     in ([2008],[2009],[2010],[2011],[2012])) as pvt

这是结果:

 PercentHmlss   PercentMale     Percentfemale PercentEmployed [2008]  [2009]    [2010]      [2011]   [2012]
    0               55              40            80           NULL     20      NULL         NULL     NULL
    0               64              35            67           NULL    NULL     162            NULL  NULL
    0               69              27            34           NULL    NULL     NULL          285     NULL
    0              100               0           100             1     NULL     NULL         NULL    NULL
   10               56              43             1           NULL    NULL     NULL         NULL     58

谢谢。

【问题讨论】:

  • 你还没说是什么问题。 No success 不是描述。你收到错误信息了吗? *(例如,您似乎在PercentEmployed[2008] 中间缺少,。)或者您是否获得了数据,而不是您预期的数据?

标签: sql sql-server-2005 pivot unpivot


【解决方案1】:

为此,您需要先执行UNPIVOT,然后执行PIVOT

SELECT *
from
(
  select year, quantity, type
  from 
  (
    select year, percentmale, percentfemale, percenthmlss, percentemployed, totalsrvd
    from t
  ) x
  UNPIVOT 
  (
    quantity for type
    in 
    ([percentmale]
     , [percentfemale]
     , [percenthmlss]
     , [percentemployed]
     , [totalsrvd])
  ) u
) x1
pivot
(
  sum(quantity)
  for Year in ([2008], [2009], [2010], [2011], [2012])
) p

查看SQL Fiddle with a Demo

编辑进一步解释:

您已接近您尝试的 PIVOT 查询,因为您以所需的列格式获得了 Year 的数据。但是,由于您想要数据行中最初包含在 percentmalepercentfemale 等列中的数据 - 您需要先取消透视数据。

基本上,您所做的是获取原始数据并根据年份将其全部放在行中。 UNPIVOT 会将您的数据以格式 (Demo) 放置:

Year    Quantity    Type
2008    100         percentmale
2008    0           percentfemale
etc

将数据转换为这种格式后,您就可以执行 PIVOT 以获得所需的结果。

【讨论】:

  • 谢谢蓝脚。我不太明白它是如何工作的……但它确实有效!我会研究它并尝试弄清楚。感谢您的帮助。
  • @Stan 在PIVOTUNPIVOT 上查看我的编辑以及更多信息
  • 感谢您的解释,感谢您的帮助。
  • 一件事我不明白,代码是如何做到的,所以数值是 QUANTITY 和 TYPE 是字段名称?我在 Fiddle 中玩过代码,发现 Quantity 和 Type 不是关键字,看起来好像它们放在 Select 语句中的位置没有效果。我错过了什么?再次感谢。
  • @Stan 我刚刚选择了这些名称,您可以为这些字段调用任何名称。您只需为要取消透视的列指定一个名称。
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多