繁体   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