SQL数据透视表不起作用

时间:2012-07-06 22:40:29

标签: sql sql-server-2005 pivot unpivot

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

感谢。

1 个答案:

答案 0 :(得分:3)

为此,您需要执行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以获得所需的结果。