2017-04-26 6 views
0

表:複数ケースのSQLクエリは、複数の列として単一の行を取得

ID VT_Type1 Vt_type2 VT_Type3 Status_1 Status_2 Status_3 Date_1 Date_2 Date_3 
1  -1  -1  0 X  Y  Z  04/12 05/12 06/12 
2  -1  -1  -1 A  B  C  06/12 07/12 07/10 

期待出力

Id Type Status Date 
1 1 X  04/12 
1 2 Y  05/12 
2 1 A  06/12 
2 2 B  07/12 
2 3 C  07/10 

タイプ-1、対応するステータス及び日付列が行として取得されるべきた場合。上記の例ID1で見られるように、type1は-1を持ち、type2は-1を持つので、2は2行に変換されなければならず、type 3は0であるため、考慮されません。私は例をオンラインで見るとき、私は使用されるケースを見ていますが、私の必要性に対応するための使い方はわかりません。

+2

ひどいテーブルデザイン。他のクエリの結果ですか? –

+1

列**タイプ**のデータはどこから来ますか?入力にはそのようなものはありません。 VT_Type1などの場合は1ですか?その場合、目的の出力にタイプミスがあります。最後の行にはType = 3が必要です。あなたはそれを2と表示します。 – mathguy

+0

また、「has」(?)-1とタイプすると、行を取得したいと考えていますが、「持っている」場合は0とみなされます。他の値はどうですか?あなたの例では、タイプ= 1であり、出力で考慮されます。したがって、型が0の場合を除いて、出力を検討してください。そうでない場合、** complete **ルールは何ですか?型も 'null 'である可能性があります - もしそうなら、それは"考慮される "か無視されるべきですか? – mathguy

答えて

1
のOracle 11.1で

以上は、あなたがUNPIVOT演算子を使用することができます。大量のデータを使用している場合は、任意の種類のUNION ALLアプローチを使用して3回ではなく、1回だけテーブルを読み取る必要があるため、実行時間が大幅に改善されます。

DATEはOracleの予約語であるため、(出力の)列名はdateからdtに変更されました。 typeはあまり良くありません(キーワードですが予約されていません)。それも避けるのが最善です。私はテストデータを作成したときにあなたの日付を文字列として扱いましたが、日付とまったく同じです。

with句はソリューションの一部ではありません(クエリで盲目的にコピーアンドペーストしないでください)。私はテスト目的のためだけに追加しました。

with 
    test_data (ID, VT_Type1, Vt_type2, VT_Type3, Status_1, Status_2, Status_3, 
                 Date_1, Date_2, Date_3) as (
     select 1, -1, -1, 0, 'X', 'Y', 'Z', '04/12', '05/12', '06/12' from dual union all 
     select 2, -1, -1, -1, 'A', 'B', 'C', '06/12', '07/12', '07/10' from dual 
    ) 
select id, type, status, dt 
from test_data 
unpivot ((vt_type, status, dt) for type in ((vt_type1, status_1, date_1) as 1, 
               (vt_type2, status_2, date_2) as 2, 
               (vt_type3, status_3, date_3) as 3 
              ) 
     ) 
where vt_type != 0 
; 

ID TYPE STATUS DT 
-- ---- ------ ----- 
1  1 X  04/12 
1  2 Y  05/12 
2  1 A  06/12 
2  2 B  07/12 
2  3 C  07/10 
+0

完璧です。私の実際のテーブルで – Pat

+0

、date_1がvarcharデータ型で、date_2が日付データ型の場合、答えを変更する方法。実際に私のテーブルでは、私はこの種の約15列を持っており、私はここで例えば3列しか与えていない。 – Pat

+0

この問題をどのように解決する予定ですか**どのソリューションを使用するかは関係ありませんか?どんな解決策でも同じ問題が発生します。おそらく、すべての値を日付に変更する必要があります。文字列を日付に変換するには、適切な書式モデルで 'to_date()'を使用する必要があります。この側面についてさらに助けが必要な場合は、必要に応じて別の質問を開き、この質問にリンクしてください。そこに提供されている例では、(3つではなく)2つの列だけが必要ですが、投稿したサンプルデータが、あなたが提起した問題を正確に反映していることを確認してください。 – mathguy

1

クエリ三回、一回各タイプのテーブル:

select id, 1 as type, status_1 as status, date_1 as "date" from mytable where VT_Type1 = -1 
union all 
select id, 2 as type, status_2 as status, date_2 as "date" from mytable where VT_Type2 = -1 
union all 
select id, 3 as type, status_3 as status, date_3 as "date" from mytable where VT_Type3 = -1 
関連する問題