所以我有一张这样的表
表格1
Quote Ref | Product A | Product B | Product C | Product D -----------+-----------+-------------+-----------+----------- 12 | 222333 | 4748847478 | 0 | 0
我需要Business Group使用下表找出这属于哪个。
Business Group
我对等于零的产品字段不感兴趣,因为报价中没有这些产品,因此没有要映射的业务组。对于此报价,产品A和B列具有非零值,并且可以映射到业务组。( 关键 )
表2
Product Line | Business Group Product A | Manfacturing Product B | Tech Net
因此,我看一下UNPIVOT表1中的数据。
UNPIVOT
SELECT [QUOTE Ref], [Product Line], [Value] FROM (SELECT [QUOTE Ref], [Product A], [Product B], [Product C], [Product D] FROM [Table1]) p UNPIVOT ([Value] FOR [Product Line] IN ([Product A], [Product B], [Product C], [Product D] ) )AS unpvt;
表1的DATA现在像这样
Quote Ref | Product Line | Value -----------+--------------+------------ 12 | Product A | 222333 12 | Product B | 4748847478 12 | Product C | 0 12 | Product D | 0
问题是4万行现在变成470万行。
现在,我知道我不需要透视表中的行,其中产品线的值等于零。如何在unpivot查询中删除这些条目,或者甚至在启动UNPIVOT之前可以对基表做些什么?我的数据库足够大,无法处理数据库中约20个相似的表和60百万行。
您应该添加条件,以删除value = 0最终结果集中包含的条目。您无法在生成数据的SELECT查询中执行此操作,因此将当前结果集作为子查询括起来,如下所示:
value = 0
;WITH Data AS ( SELECT [QUOTE Ref], [Product Line], [Value] FROM ( SELECT [QUOTE Ref], [Product A], [Product B], [Product C], [Product D] FROM [Table1] ) p UNPIVOT ([Value] FOR [Product Line] IN ([Product A], [Product B], [Product C], [Product D] ) )AS unpvt ) SELECT * FROM DATA WHERE Value <> 0;