안녕하세요.. WITH TMP (MED_DP, MED_NM, MED_DVSN, MED_DVSN_NM, MDLT_CD, EXMN_CNT, EXMN_MED_DP_CNT, PID_CNT) AS ( SELECT '1028', '내과', 'I', '입원', 'CT', 1, 1, 1 FROM DUAL UNION ALL SELECT '1028', '내과', 'I', '입원', 'DX', 14, 14, 12 FROM DUAL UNION ALL SELECT '1028', '내과', 'I', '입원', 'MG', 1, 1, 1 FROM DUAL UNION ALL SELECT '1028', '내과', 'I', '입원', 'US', 5, 5, 4 FROM DUAL ) SELECT * FROM TMP PIVOT( SUM(EXMN_CNT) FOR MDLT_CD IN ( 'CT' AS CT,'DX' AS DX,'MG' AS MG,'US' AS US )) ORDER BY MED_NM
다음과 같이 자료가 있을때 PIVOT 을 하게되면..
MED_DP | MED_NM | MED_DVSN | MED_DVSN_NM | EXMN_MED_DP_CNT | PID_CNT | CT | DX | MG | US |
1028 | 내과 | I | 입원 | 1 | 1 | 1 | 1 | ||
1028 | 내과 | I | 입원 | 5 | 4 | 5 | |||
1028 | 내과 | I | 입원 | 14 | 12 | 14 |
EXMN_MED_DP_CNT 와 PID_CNT 가 SUM이 안된 상태로 나오는 데요..
SUM되게 Pivot 할 수 있을까요?
실제 원하는 결과는..
MED_DP | MED_NM | MED_DVSN | MED_DVSN_NM | EXMN_MED_DP_CNT | PID_CNT | CT | DX | MG | US |
1028 | 내과 | I | 입원 | 2 | 2 | 1 | 1 | ||
1028 | 내과 | I | 입원 | 5 | 4 | 5 | |||
1028 | 내과 | I | 입원 | 14 | 12 | 14 |
입니다...다시 한번 감싸려 해도 EXMN_MED_DP_CNT, PID_CNT 의 원 갯수를 Pivot시 잘못 가져오기 때문에 잘 안되네요..
도움 부탁 드립니다..
SELECT med_dp , med_nm , med_dvsn , med_dvsn_nm , SUM(exmn_med_dp_cnt) exmn_med_dp_cnt , SUM(pid_cnt) pid_cnt , SUM(DECODE(mdlt_cd, 'CT', exmn_cnt)) ct , SUM(DECODE(mdlt_cd, 'DX', exmn_cnt)) dx , SUM(DECODE(mdlt_cd, 'MG', exmn_cnt)) mg , SUM(DECODE(mdlt_cd, 'US', exmn_cnt)) us FROM tmp GROUP BY med_dp, med_nm, med_dvsn, med_dvsn_nm ORDER BY med_dp, med_dvsn ;
억지로 만들려고자 한다면 되긴 하죠.
PIVOT 은 짜여진 틀에 딱 맞춰야 하는 불편함이 좀 있죠.
PIVOT 보다는 그냥 집계하는게 다양한 형태의 집계가 가능합니다.
SELECT * FROM (SELECT med_dp , med_nm , med_dvsn , med_dvsn_nm , SUM(exmn_med_dp_cnt) OVER(PARTITION BY med_dp, med_dvsn) exmn_med_dp_cnt , SUM(pid_cnt ) OVER(PARTITION BY med_dp, med_dvsn) pid_cnt , mdlt_cd , exmn_cnt FROM tmp ) PIVOT (SUM(exmn_cnt) FOR mdlt_cd IN ('CT' ct, 'DX' dx, 'MG' mg, 'US' us)) ORDER BY med_dp, med_dvsn ;