안녕하세요 회원여러분~ 시원한 아침입니다 오늘도 한 수 배워가고자 글을 남깁니다. 제가 요청 드릴 내용은! 특정한 부서의 병상수는 소계 및 총계에 합산되지 않되 조회는 되게끔 하고 싶습니다.. (특정 값을 제외 시키고싶어SUB_VAL5에 N이란 값을 넣어 시도 해보았으나.. 역시 의미없습니다) 간곡히 부탁드리겠습니다. 아래 그림에서 대괄호 친 값이 집계에 포함이 안되었으면 좋겠습니다.. SELECT A.VAL , B.SUB_VAL5 , SUB_VAL AS SUB_VAL , DECODE(SUB_VAL,'AA','일반병동','CC','중환자실','DD','중환자실','EE','중환자실',COM_NM) AS WARD_GB , DUT_DEPT_CD , DECODE(GROUPING_ID(A.VAL,DUT_DEPT_CD),1,'[소계]',3,'[총계]',COM_NM) AS DUT_DEPT_NM , NVL(SUM(BED_CNT),0) AS BED_CNT , DECODE(B.SUB_VAL5,'',TO_CHAR(SUM(BED_CNT)),'N','['||BED_CNT||']') BED_CNT , SUM(NUR_REG) AS NUR_REG , SUM(NUR_TMP) AS NUR_TMP , SUM(NUR_TOT) AS NUR_TOT , SUM(NUR_AIDE_M) AS NUR_AIDE_M , SUM(NUR_AIDE_F) AS NUR_AIDE_F , SUM(NUR_AIDE_TMP) AS NUR_AIDE_TMP , SUM(NUR_AIDE_TOT) AS NUR_AIDE_TOT , SUM(PART_NUR_M) AS PART_NUR_M , SUM(PART_NUR_F) AS PART_NUR_F , SUM(PART_NUR_TMP) AS PART_NUR_TMP , SUM(PART_NUR_TOT) AS PART_NUR_TOT , SUM(ADMIN_JOB) ADMIN_JOB , SUM(REG_EMP) AS REG_EMP , SUM(TMP_EMP) AS TMP_EMP , DECODE(GROUPING_ID(A.VAL,DUT_DEPT_CD),1,SUM(MAT_LEAVE),3,SUM(MAT_LEAVE)*-1,SUM(MAT_LEAVE)) AS MAT_LEAVE , DECODE(GROUPING_ID(A.VAL,DUT_DEPT_CD),1,SUM(LEAVE),3,SUM(LEAVE)*-1,SUM(LEAVE)) AS LEAVE , DECODE(GROUPING_ID(A.VAL,DUT_DEPT_CD),1,SUM(SICK_LEAVE),3,SUM(SICK_LEAVE)*-1,SUM(SICK_LEAVE)) AS SICK_LEAVE , 'Y' CALC_YN FROM MIN_NUR_GRD_BAS A , OCS.ZMM_COM_CD B WHERE CALC_YMD = '20160622' AND B.COM_CD = DUT_DEPT_CD AND B.DIV_CD = 'NUR_DEPT_GB' GROUP BY GROUPING SETS((A.VAL,DUT_DEPT_CD,B.COM_NM,B.SORT_NO,A.SUB_VAL,BED_CNT,B.SUB_VAL5),(A.VAL),()) ORDER BY A.VAL,B.SORT_NO;
소계 및 총계 구할 때는 Grouping Sets 보다는 Rollup 이 적당할 듯 하구요.
Group By 에 bed_cnt 는 빼는게 맞을 듯 하네요.
총계일 경우 마이너스를 붙여주는 부분의 Decode 문은 구문 간소화가 가능하겠네요.
원하시는 bed_cnt 부분도 Decode 로 해결하시면 됩니다.
a. b. 등 컬럼명에 알리아스를 생략한 경우가 많은데요.
테이블을 모르는 상태에서 쿼리 수정할 때 상당히 곤란합니다. 알리아스 꼭 붙여주세요.
SELECT a.val , b.sub_val5 , a.sub_val , DECODE(a.sub_val, 'AA', '일반병동', 'CC', '중환자실', 'DD', '중환자실', 'EE', '중환자실', b.com_nm) AS ward_gb , a.dut_dept_cd , DECODE(GROUPING_ID(a.val, a.dut_dept_cd), 1, '[소계]', 3, '[총계]', b.com_nm) AS dut_dept_nm , NVL(DECODE(GROUPING(a.dut_dept_cd), 0, SUM(a.bed_cnt), SUM(DECODE(b.sub_val5, '', a.bed_cnt))), 0) AS bed_cnt , SUM(nur_reg ) AS nur_reg , SUM(nur_tmp ) AS nur_tmp , SUM(nur_tot ) AS nur_tot , SUM(nur_aide_m ) AS nur_aide_m , SUM(nur_aide_f ) AS nur_aide_f , SUM(nur_aide_tmp) AS nur_aide_tmp , SUM(nur_aide_tot) AS nur_aide_tot , SUM(part_nur_m ) AS part_nur_m , SUM(part_nur_f ) AS part_nur_f , SUM(part_nur_tmp) AS part_nur_tmp , SUM(part_nur_tot) AS part_nur_tot , SUM(admin_job ) AS admin_job , SUM(reg_emp ) AS reg_emp , SUM(tmp_emp ) AS tmp_emp , SUM(mat_leave ) * DECODE(GROUPING_ID(a.val, a.dut_dept_cd), 3, -1, 1) AS mat_leave , SUM(leave ) * DECODE(GROUPING_ID(a.val, a.dut_dept_cd), 3, -1, 1) AS leave , SUM(sick_leave) * DECODE(GROUPING_ID(a.val, a.dut_dept_cd), 3, -1, 1) AS sick_leave , 'Y' calc_yn FROM min_nur_grd_bas a , ocs.zmm_com_cd b WHERE a.calc_ymd = '20160622' AND b.com_cd = a.dut_dept_cd AND b.div_cd = 'NUR_DEPT_GB' GROUP BY ROLLUP(a.val, (b.sort_no, a.sub_val, a.dut_dept_cd, b.com_nm, b.sub_val5)) ORDER BY a.val, b.sort_no ;