簡體   English   中英

取消透視以改變列數

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

參見帶有演示的SQL Fiddle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM