2016-12-13 7 views
0

問題SQLのPIVOT - 複数の動的な列

は倍数がある場合、データの列を使用したいプロバイダにファイルを提出する必要があります。

私が作成した以下の実施例のような行として私たちのSQL DBのログの主張 ':

[email protected]  Number Type    Date      Value 
ABHX06HQ01 1  Escape Of Water  2009-05-01 00:00:00.000  840 
ABHX06HQ01 2  Escape Of Water  2009-05-06 00:00:00.000  400 
ABHX06HQ01 3  Escape Of Water  2010-02-01 00:00:00.000  304 
ABHX06HQ01 4  Storm Damage  2010-02-11 00:00:00.000  59 
ABHX06HQ01 5  Accidental Damage 2011-10-14 00:00:00.000  497 
ABHX06HQ01 6  Falling Trees  2011-09-29 00:00:00.000  1172 

私が提出する必要があるファイルは、これらの請求行のそれぞれはとても基本的にSQLの列の列であることを要求するだろうgo:

ClaimNumber1, ClaimType1,   ClaimDate1,     ClaimValue1, ClaimNumber2, ClaimType2,   ClaimDate2,     ClaimValue2, ClaimNumber3, ClaimType3,   ClaimDate3,     ClaimValue3 
1    Escape Of Water  2009-05-01 00:00:00.000  840    2    Escape Of Water  2009-05-06 00:00:00.000  400    3    Escape Of Water  2010-02-01 00:00:00.000  304 

これは、動的列はすばらしいが、これはおそらく最大10である可能性があります。私はたとえどこから始めるべきかわからないが、これがピボットであると感じている。

私はそれぞれの番号= XのためにUNIONを実行することから始めましたが、最終的に私の結果を得ることはできますが、非常に古風なようです。

答えて

1

PIVOT演算子を使用できますが、私は条件付き集計が好ましいです。

この手法では、1つまたは複数のcase expressionsを使用して行を列に分割します。集計関数と組み合わされたgroup by節は、最後の行数を減らします。

次は、テーブルの最初の3行を使用する例です。

-- Rows to columns 
SELECT 
    PolRef, 
    CASE WHEN Number = 1 THEN [TYPE_ID] ELSE '' END AS Type_1, 
    CASE WHEN Number = 2 THEN [TYPE_ID] ELSE '' END AS Type_2, 
    CASE WHEN Number = 3 THEN [TYPE_ID] ELSE '' END AS Type_3 
FROM 
    YourTable 
GROUP BY 
    PolRef 
; 

戻り

Polref x Type_1   Type_2   Type_3 
ABHX06HQ01 Escape Of Water 
ABHX06HQ01     Escape Of Water 
ABHX06HQ01         Escape Of Water 

としてグループを追加し、そのようなaggregation function

-- Remove additional rows. 
SELECT 
    PolRef, 
    MAX(CASE WHEN Number = 1 THEN [TYPE_ID] ELSE '' END) AS Type_1, 
    MAX(CASE WHEN Number = 2 THEN [TYPE_ID] ELSE '' END) AS Type_2, 
    MAX(CASE WHEN Number = 3 THEN [TYPE_ID] ELSE '' END) AS Type_3 
FROM 
    YourTable 
GROUP BY 
    PolRef 
; 

は、行数が3から1に、返さ軽減します。

Polref x Type_1   Type_2   Type_3 
ABHX06HQ01 Escape Of Water Escape Of Water Escape Of Water 
+0

私はUNIONを使用してこの作業を開始していましたが、結局のところ恐ろしい見方で終わってしまいました。非常に正確でポイントの答えをありがとうございます。 – Lynchie

+0

問題ありません。それが助けてくれてうれしい。ピボット演算子を使用するよりも、このアプローチがコード化する方が早いことがわかります。私はしばしばExcelの式を使用して私のケース式を生成します(同じコードを何度も繰り返し入力することを拒否します)。 –

+0

私は同意する - 私はPIVOTのものと混じってすべて自分自身を取得し、私はExcelの表現のフロントでそれを聞く - まさに私が笑った – Lynchie