2017-11-16 13 views
3
多く

に1行を回しこれを行うには良い方法がありますが、私は、SQL Serverを使用しています2012年クエリでデータの列を正規化 -

私は以下のようになりますベンダーとしてで構築されたテーブルを持っています:

Customer, Date, Desc1, Qty1, Price1, Desc2, Qty2, Price2, Desc3, Qty3, Price3 

これを返す結果セットが必要です。

Customer, Date, Desc, Qty, Price 

私は今日、次のような解決策を講じていますが、誰かがより優れた効率性を備えていますか?

Select Customer, Date, Desc1, Qty1, Price1 
UNION ALL 
Select Customer, Date, Desc2, Qty2, Price2 
UNION ALL 
Select Customer, Date, Desc3, Qty3, Price3 
+2

あなたがが、あなたが声明 –

+2

と*最高*ソリューションでこれを句を置くことができる場所を共通に持っている場合は、罰金であるにありますあなたの悪いテーブルのスキーマを修正してください。これは1NFではありません。繰り返しのグループがあります。あなたのテーブルは、おそらく 'line_number'カラムを含むクエリの出力のように見えるはずです。 – Bohemian

+0

代替方法は存在しますが、使用しているデータベースのタイプによって異なります。 ** **常に**データベースに質問を付けてください(例:Sybase? MySQL?SQlL Serer?Oracle?...... more) –

答えて

1

UNION ALLの方法は問題ありません。ただし、CROSS APPLYと異なる性能や読みやすさを持っていることがあります。各繰り返しグループは実際には同じデータ型であると仮定しています

SELECT t1.Customer, 
    t1.[Date], 
    x.[Desc], 
    x.Qty, 
    x.Price 
FROM UnnamedTable t1 
CROSS APPLY (
    VALUES (Desc1, Qty1, Price1), 
     (Desc2, Qty2, Price2), 
     (Desc3, Qty3, Price3) 
    ) x ([Desc], Qty, Price); 

を。すなわち、Qty1,Qty2およびQty3はすべてint(またはそれに類する)などである。

また、UNPIVOT式を使用することもできますが、正直なところ、私はUNPIVOTの構文が非常に難解だと感じています。

+1

と同様、unpivot =不可解なコメント:) –

2

次はSQL Serverの代替です。 cross applyvaluesを使用し、unpivotコマンドの効率的で非常に柔軟な代替であり、データの「正規化」に本当に便利です。

select Customer, Date, ca.description, ca.qty, ca.price 
from YourTable 
cross apply (
    values 
     (Desc1, Qty1, Price1) 
    , (Desc2, Qty2, Price2) 
    , (Desc3, Qty3, Price3) 
    , (Desc4, Qty4, Price4) 
    ) ca (description, qty, price) 

NBvalues領域内の各行は出力の新しい行を形成するので、あなたがその上に見るようにレイアウトされた場合、最終的なレイアウトに視覚的に類似しています。この参照の詳細については

:あなたが持っているものSpotlight on UNPIVOT, Part 1(ブラッド・シュルツ)

関連する問題