1

だから私はこのようなテーブルを持っています

表1

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

Business Group以下の Table を使用して、これがどれに属しているかを調べる必要があります。

見積もりにこれらの製品がないため、マッピングするビジネス グループがないため、ゼロに等しい製品のフィールドには興味がありません。この見積もりでは、製品 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

問題は、40,000 行が 470 万行になることです。

これで、製品ラインの値がゼロに等しい、ピボットされていないテーブルの行は必要ないことがわかりました。unpivot クエリでこれらのエントリを削除するにはどうすればよいですか、または UNPIVOT を開始する前にベース テーブルに対してできることはありますか? 私のデータベースは、データベース内の約 20 の同様のテーブルと 6,000 万行を処理するのに十分な大きさではありません。

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 に答える