Sql 使用不同列数取消Pivot
我得到了一个需要提取和规范化的数据表。看起来是这样的:Sql 使用不同列数取消Pivot,sql,sql-server-2008,Sql,Sql Server 2008,我得到了一个需要提取和规范化的数据表。看起来是这样的: AccountName BrandCoke BrandPepsi BrandDiet SalesCoke SalesPepsi SalesDiet Account1 X X 100 200 Account2 X X 300 400 Acc
AccountName BrandCoke BrandPepsi BrandDiet SalesCoke SalesPepsi SalesDiet
Account1 X X 100 200
Account2 X X 300 400
Account3 X 500
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'
我需要对其进行规范化,将列转换为行,如下所示:
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方法执行此操作,并像这样执行单独的选择操作:
AccountName BrandCoke BrandPepsi BrandDiet SalesCoke SalesPepsi SalesDiet
Account1 X X 100 200
Account2 X X 300 400
Account3 X 500
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可以轻松完成此操作,还是联合多个选项选择更好的解决方案?由于您使用的是SQL Server 2008,您应该能够使用值交叉应用来成对取消列的pivot。语法将是:
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;
看