2014-09-19 5 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 기능을 추가하고 시도 자체는 다음과 같이 조인

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

모든 제안을 크게 감상 할 수있다 :

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 

그러나, 이것은 다음과 같은 생산하고 있습니다. 괴물 같은 코드 블록을 사용하지 않고이 작업을 수행하는 방법을 찾고 싶습니다. 감사!

답변

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