2012-03-23 14 views
1

私は、次のようなテーブルがある:ピボット複数行

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'; 

+1

結果の列「A」(元の表のキー「A」を含む行)のすべてが同じデータ型であることはご存知ですか?たとえば、あなたの例では、すべてのCはDateまたはDateTimeですが、それは保証されていますか?そして、各id/keyペアごとに1つの行だけがありますか?基本的には、各行のstr_val、dateval、numvalをUNPIVOT(キーワードまたはUNIONを使用して)アンピットし、旧式の "Max CASE(...)as A"構文を使用して結果をピボットすると思います。 –

+0

@LevinMagruderあなたの前提はすべて正しいです。私はそれを試してみる必要があります。 –

+0

実際には、Chris Kellyの答えとGavin Cattelの方がおそらく良いでしょう。それをすべて試してはいけない理由はありませんが。 –

答えて

3

をあなたがそこに道の90% :

with cte as (
    select 
     id, 
     case [key] 
      when 'A' 
      then str_val 
     end as A, 
     case [key] 
      when 'B' 
      then str_val 
     end as B, 
     case [key] 
      when 'C' 
      then date_val 
     end as C, 
     case [key] 
      when 'D' 
      then num_val 
     end as D, 
     case [key] 
      when 'E' 
      then str_val 
     end as E 
    from test_table 
) 
select id, max(A) as A, max(B) as B, max(C) as C, max(D) as D, max(E) as E 
from cte 
group by id 
+0

ああ、ありがとう。これは完全に動作します! –

2

限りIDとキーは、テーブルごとに一意の組み合わせですと、あなたは次のようにクエリを書くことができあなたはその代わりにそれから始めることができます)。次に、指定したIDの各キーに参加する必要があります。

キーのデータ型に頼ることができない場合、すなわちAがストリングや日付であってもよいし、その後、あなたはそれぞれに以下を使用する必要があるの選択:

COALESCE(ta.str_val,TO_CHAR(ta.date_val,'DD-MM-YYYY'),TO_CHAR(ta.num_val)) A, 
COALESCE(tb.str_val,TO_CHAR(tb.date_val,'DD-MM-YYYY'),TO_CHAR(tb.num_val)) B, 
... 
etc. 
+0

OPはそれを必要としなくても、複数のデータ型を扱う際に+1します。 –