[英]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.