Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用不同列数取消Pivot_Sql_Sql Server 2008 - Fatal编程技术网

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;