admin

取消数据方案解决方案?

sql

所以我有一张这样的表

表格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的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百万行。


阅读 222

收藏
2021-07-01

共1个答案

admin

您应该添加条件,以删除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;

演示

2021-07-01