2014-05-08 22 views
0

我得到了一張需要提取和歸一化的數據表。它看起來像這樣:具有不同數量列的Unpivot

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更好的解決方案嗎?

回答

1

由於您使用的是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; 

SQL Fiddle with Demo