PIVOT 시 소계를 함께 표시? 1 6 948

by 동동동 [SQL Query] [2021.01.15 11:26:02]


안녕하세요..

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시 잘못 가져오기 때문에 잘 안되네요..

 

도움 부탁 드립니다..

 

 

by 마농 [2021.01.15 12:36:33]

결과가 맞나요?
뭔가 불합리해 보이고 부자연스러워 보이는 결과인데요?
SUM 이 되게 한다면? 3줄이 아니라 1줄로 나와야 하지 않나요?


by 동동동 [2021.01.15 13:16:19]

앗..예..마농님 말씀 맞네요...한줄로 모두 SUM되서 Pivot되어야 맞는거네요..


by 마농 [2021.01.15 13:19:33]
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
;

 


by 동동동 [2021.01.15 14:10:22]

마농님 답변 감사드립니다..

 

혹시 pivot으로는 안되는 건가요??


by 마농 [2021.01.15 14:31:49]

억지로 만들려고자 한다면 되긴 하죠.
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
;

 


by 동동동 [2021.01.15 15:52:26]

마농님 답변과 조언 감사드립니다...

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입