특정값은 소계및 총계에 집계가 되지 않게 하고싶습니다. 0 2 1,752

by DONKEY [SQL Query] [2016.06.22 09:12:27]


캡처.PNG (10,388Bytes)

안녕하세요 회원여러분~ 시원한 아침입니다
오늘도 한 수 배워가고자 글을 남깁니다.
제가 요청 드릴 내용은!
특정한 부서의 병상수는 소계 및 총계에 합산되지 않되
조회는 되게끔 하고 싶습니다..
(특정 값을 제외 시키고싶어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;

 

 

by 마농 [2016.06.22 10:25:54]

소계 및 총계 구할 때는 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
;

 


by DONKEY [2016.06.22 10:34:50]

질문 외 부족한 사항도 지적해주셔서 너무 감사드립니다!

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