2014-09-19 136 views
0

我在嘗試對結果集進行非規範化,以便每個ID都有一條記錄。這是一個患有多種合併症的患者列表。該數據目前看起來是這樣的:非規範化結果集

ID Disease 
1 Asthma 
1 Cancer 
1 Anemia 
2 Asthma 
2 HBP 

,我需要它看起來像這樣:

ID Disease1 Disease2 Disease3 
1 Asthma  Cancer  Anemia 
2 Asthma  HBP   <NULL or Blank> 

我研究了透視,但所有我看到的使用將不適用於聚合函數的例子。 我已經加入了ROW_NUMBER函數,並試圖自加入類似如下:

case when rownum = 1 then Disease else NULL end Disease1, 
case when rownum = 2 then Disease else NULL end Disease2, 
case when rownum = 3 then Disease else NULL end Disease3 

然而,這將產生以下:

ID Disease1 Disease2 Disease3 
1 Asthma  NULL  NULL 
1 NULL  Cancer  NULL 
1 NULL  NULL  Anemia 
2 Asthma  NULL  NULL 
2 NULL  HBP   NULL 

任何建議,將不勝感激。我真的很想找到一種方法來完成這個任務,而不需要有一塊怪異的代碼塊(這是我在嘗試完成時最終實現的)。謝謝!

回答

1

您可以使用MAX來壓縮行:

select 
    id, 
    max(case when rownum = 1 then Disease end) Disease1, 
    max(case when rownum = 2 then Disease end) Disease2, 
    max(case when rownum = 3 then Disease end) Disease3 
from (
    select 
    id, 
    disease, 
    rownum = ROW_NUMBER() OVER (partition by id order by id) 
    from your_table 
) sub 
group by id 

Sample SQL Fiddle

+1

甜!我非常接近 - 只是缺少MAX()函數。非常感謝;它做到了。 :) – rwking 2014-09-19 17:27:46