2012-03-23 132 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 

任何想法或輸入可以幫助我嗎?提前致謝。

+1

你知道,一切都將在結果列「A」(在原表中的行與鍵「A」)是相同的數據類型?例如,在你的例子中,所有的Cs都是Date或DateTime,是否有保證?每個ID /密鑰對只有一行?我想基本上你想UNPIVOT(使用關鍵字或UNIONs)每行的str_val,dateval,numval,然後使用舊式的「Max CASE(...)as」語法來轉換結果。 – 2012-03-23 20:44:38

+0

@LevinMagruder你的假設都是正確的。我必須嘗試一下。 – 2012-03-23 20:56:56

+0

事實上,克里斯凱利的回答和加文卡特爾的回答可能會更好。儘管沒有理由不嘗試所有這些。 – 2012-03-23 21:01:30

回答

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

啊,謝謝。這完美的作品! – 2012-03-23 21:04:56

2

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

在此查詢你得到所有的ID(如果你能柱回答「A」永遠在那裏你可以從那開始)。然後你必須加入給定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

+1處理多種數據類型,即使OP不需要它。 – 2012-03-23 21:21:59