私は、次のようなテーブルがある:ピボット複数行
id key str_val date_val num_val
1 A a
1 B b
1 C 2012-01-01
1 D 1
2 A c
2 E d
2 C 2012-01-02
2 D 2
私はそれが見えるように必要があります。それ自身のコラム
になるために、各キーのニーズ、基本的に
id A B C D E
1 a b 2012-01-01 1
2 c 2012-01-02 2 d
私はしようとPIVOTコマンドを便利に使用することに失敗し、現在私はcase文でこれを達成しようとしています。すなわち
select
id,
case key
when 'A'
then str_val
end as A,
case key
when 'C'
then date_val
end as C
--etc.
from test_table
しかし、この実行後に表の行を結合する方法を理解できません。私はつかまっています:
id A B C D E
1 a
1 b
1 2012-01-01
1 1
私は助けてくれると思っていますか?前もって感謝します。あなたが列を返信することができます場合は、「」常に(すべてのIDを取得し、このクエリでは
SELECT ta.str_val as A,
tb.str_val as B,
tc.date_val as C,
td.num_val as D,
te.str_val as E
FROM (SELECT DISTINCT id FROM test_table) ids
LEFT JOIN test_table ta ON ids.id = ta.id AND ta.key = 'A'
LEFT JOIN test_table tb ON ids.id = tb.id AND tb.key = 'B'
LEFT JOIN test_table tc ON ids.id = tc.id AND tc.key = 'C'
LEFT JOIN test_table td ON ids.id = td.id AND td.key = 'D'
LEFT JOIN test_table tc ON ids.id = te.id AND te.key = 'E';
:
結果の列「A」(元の表のキー「A」を含む行)のすべてが同じデータ型であることはご存知ですか?たとえば、あなたの例では、すべてのCはDateまたはDateTimeですが、それは保証されていますか?そして、各id/keyペアごとに1つの行だけがありますか?基本的には、各行のstr_val、dateval、numvalをUNPIVOT(キーワードまたはUNIONを使用して)アンピットし、旧式の "Max CASE(...)as A"構文を使用して結果をピボットすると思います。 –
@LevinMagruderあなたの前提はすべて正しいです。私はそれを試してみる必要があります。 –
実際には、Chris Kellyの答えとGavin Cattelの方がおそらく良いでしょう。それをすべて試してはいけない理由はありませんが。 –