[英]Unpivot with varying number of columns
我已经得到一张需要提取和规范化的数据表。 看起来像这样:
AccountName BrandCoke BrandPepsi BrandDiet SalesCoke SalesPepsi SalesDiet
Account1 X X 100 200
Account2 X X 300 400
Account3 X 500
我需要对其进行标准化,将列转换为行,如下所示:
AccountName Brand Sales
Account1 Coke 100
Account1 Pepsi 200
Account2 Pepsi 300
Account2 Diet 400
Account3 Coke 500
看起来很适合使用UNPIVOT
,不过我不确定如何解释品牌名称取决于2-4列中是否有“ X”的事实以及该品牌我只需要一行的事实该品牌的列中是否有“ X”。 (因此,仅应生成5行,而不是9行)
我的另一个想法是在UNPIVOT
之前使用SQL2000的方式进行此操作,并像这样进行单独的SELECTS
:
SELECT AccountName, Brand='Coke', Sales = SalesCoke FROM T WHERE BrandCoke = 'X'
UNION
SELECT AccountName, Brand='Pepsi', Sales = SalesPepsi FROM T WHERE BrandPepsi = 'X'
UNION
SELECT AccountName, Brand='Diet', Sales = SalesDiet FROM T WHERE BrandDiet = 'X'
但这似乎不太优雅。
可以使用UNPIVOT轻松完成此操作,还是UNIONing多个SELECT是更好的解决方案?
由于您使用的是SQL Server 2008,因此您应该可以将CROSS APPLY与VALUES一起使用,以取消对成对的列的操作。 语法为:
select AccountName, Brand, Sales
from yourtable
cross apply
(
values
('Coke', BrandCoke, SalesCoke),
('Pepsi', BrandPepsi, SalesPepsi),
('Diet', BrandDiet, SalesDiet)
) c (Brand, origCol, Sales)
where origCol is not null;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.