我有一个表数据,其中的数据将显示为,如下所示:
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 :(得分: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