0

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

谢谢。

4

1 回答 1

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

编辑进一步说明:

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

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

Year    Quantity    Type
2008    100         percentmale
2008    0           percentfemale
etc

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

于 2012-07-06T22:57:30.123 回答