1

所以我有一张这样的桌子

表格1

 Quote Ref | Product A |  Product B  | Product C | Product D
-----------+-----------+-------------+-----------+-----------     
    12     |   222333  |  4748847478 |     0     |     0

我需要使用下表找出它Business Group属于哪个。

我对等于零的产品字段不感兴趣,因为报价中没有这些产品,因此没有要映射的业务组。对于此报价,产品 A 和 B 列具有非零值,可以映射到业务组。( 关键 )

表 2

Product Line |   Business Group 
Product A    |   Manfacturing 
Product B    | Tech Net

因此,我查看UNPIVOT了表 1 中的数据。

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 的数据现在像这样

 Quote Ref | Product Line |   Value
-----------+--------------+------------
    12     |  Product A   |   222333
    12     |  Product B   | 4748847478
    12     |  Product C   |     0 
    12     |  Product D   |     0

问题是 40 k 行现在变成了 470 万行。

现在我知道我不需要未透视表中 Product Line 的值等于零的行。如何在 unpivot 查询中删除这些条目,或者在启动 UNPIVOT 之前我可以对基表做些什么?我的数据库足够大,可以处理数据库中大约 20 个类似的表和 60 额外的百万行。

4

1 回答 1

1

您应该添加删除value = 0最终结果集中的条目的条件。您无法在生成数据的 SELECT 查询中执行此操作,因此请将您当前的结果集作为子查询括起来,如下所示:

;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;

演示

于 2012-06-20T11:08:00.727 回答