如何将列转换为行

时间:2013-08-29 14:04:15

标签: sql-server tsql pivot

我有一个表数据,其中的数据将显示为,如下所示:

DatePeriod  Good    Fair    Poor    NotCategorised  NotTested   GoodPercentage  FairPercentage  PoorPercentage  NotCategorisedPercentage    NotTestedPercentage
Feb-13  4   0   0   0   60  6.25    0   0   0   93.75

对于这个,我使用 UNPIVOT 编写了查询。

Select DatePeriod,Legend FROM 
(
select DatePeriod,Good,Fair,Poor,NotCategorised,NotTested,GoodPercentage,
FairPercentage,poorPercentage,NotCategorisedPercentage,NotTestedPercentage  from #cte 

)P
UNPIVOT(Legend FOR  #CTE IN (Good,Fair,Poor,NotCategorised,NotTested))AS UNPVT; 

我没有得到所需的输出

我的结果集需要这样:

year    Legend  percent count
Dec-12  Good    13.89   35
Dec-12  Fair    0   0
Dec-12  Poor    0   0
Dec-12  NC  0   0
Dec-12  NoData  86.11   217

建议我最好的方法。

2 个答案:

答案 0 :(得分:2)

您没有指定正在使用的SQL Server版本,但使用UNPIVOT作为数据可能会更困难,因为您想要取消集合中的列。使用CROSS APPLY获取结果可能更容易:

select dateperiod,
  Legend,
  [Percent],
  [Count]
from yourtable t
cross apply
(
  select 'Good', Good, GoodPercentage union all
  select 'Fair', Fair, FairPercentage union all
  select 'Poor', Poor, PoorPercentage union all
  select 'NotCategorised', NotCategorised, NotCategorisedPercentage union all
  select 'NotTested', NotTested, NotTestedPercentage
) c (Legend, [Percent], [Count]);

SQL Fiddle with Demo。如果您使用的是支持VALUES子句的SQL Server版本,则可以将上述内容更改为以下内容:

select dateperiod,
  Legend,
  [Percent],
  [Count]
from yourtable t
cross apply
(
  values
    ('Good', Good, GoodPercentage),
    ('Fair', Fair, FairPercentage),
    ('Poor', Poor, PoorPercentage),
    ('NotCategorised', NotCategorised, NotCategorisedPercentage),
    ('NotTested', NotTested, NotTestedPercentage)
) c (Legend, [Percent], [Count]);

SQL Fiddle with Demo。结果如下:

| DATEPERIOD |         LEGEND | PERCENT | COUNT |
|     Feb-13 |           Good |       4 |  6.25 |
|     Feb-13 |           Fair |       0 |     0 |
|     Feb-13 |           Poor |       0 |     0 |
|     Feb-13 | NotCategorised |       0 |     0 |
|     Feb-13 |      NotTested |      60 | 93.75 |

答案 1 :(得分:1)

您可以unpivot两次。

Select 
    DatePeriod,
    Legend,
    amount,
    pc      
FROM 
(
select DatePeriod,
Good,Fair,Poor,NotCategorised,NotTested,GoodPercentage,
FairPercentage,poorPercentage,NotCategorisedPercentage,NotTestedPercentage  
from yourtable    
)P
UNPIVOT(Amount FOR  Legend IN (Good,Fair,Poor,NotCategorised,NotTested))AS UNPVT
unpivot(pc for var in (GoodPercentage, FairPercentage, PoorPercentage, NotCategorisedPercentage,NotTestedPercentage)) u2
where REPLACE(var,'Percentage','')=Legend

或者,如果您的数据似乎包含冗余信息,请执行百分比计算

Select 
    DatePeriod,
    Legend,
    amount, 
    100.0*Amount/nullif(SUM(Amount) over (partition by dateperiod),0)

FROM 
(
select DatePeriod,
Good,Fair,Poor,NotCategorised,NotTested,GoodPercentage,
FairPercentage,poorPercentage,NotCategorisedPercentage,NotTestedPercentage  from @t

)P
UNPIVOT(Amount FOR  Legend IN (Good,Fair,Poor,NotCategorised,NotTested))AS UNPVT