2013-08-29 66 views
1

我在那里的数据将显示这样一个表中的数据:如何列转换为行

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 

我建议最好的方式。

+0

它有助于提供表定义,和你实际看到的结果。我们输入的越少,为了测试更快,您将得到答案。 – BlackICE

回答

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。如果您使用的是SQL Server版本支持VALUES子句,那么你可以改变上面的以下内容:

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

你可以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