초보 쿼리 질문 좀 할게요 0 1 511

by 레드콘 [SQL Query] [2019.10.02 16:14:44]


DEPTMST (테이블) - 부서 마스터코드

DPET  부서코드 (필드)

 

LUNCH (테이블)  - 점심식사 발권

DATE  일자

DEPT 부서코드

USID  유저

 

부서마다 점심식사권을 발급하는데...

한달동안 일자별 부서별 점심 건수를 파악하려고 하는데...

특정 일마다 A라는 부서 직원이 한명도 점심식사권을 발급하지 않은건은 0으로 표시를 하고 싶습니다.  - (LUNCH 테이블에 데이터가 존재하지 않음)

어떻게 해야할까요? 항상 있는데이터 기준으로 조회하다가 특정일마다 존재하지 않는 데이터는 0으로 나 올 수 있게 하려니 머리가 안돌아가네요^^;

 

 

 

 

by 마농 [2019.10.02 17:39:43]
WITH deptmst AS
(
SELECT 10 dept, '오라클' dname FROM dual
UNION ALL SELECT 20, '구루비' FROM dual
)
, lunch AS
(
SELECT '20191001' dt, 10 dept, 1 usid FROM dual
UNION ALL SELECT '20191001', 10, 2 FROM dual
UNION ALL SELECT '20191001', 20, 3 FROM dual
UNION ALL SELECT '20191002', 20, 4 FROM dual
UNION ALL SELECT '20191002', 20, 5 FROM dual
)
, calendar AS
(
SELECT TO_CHAR(dt + LEVEL - 1, 'yyyymmdd') dt
  FROM (SELECT TO_DATE('201910', 'yyyymm') dt FROM dual)
 CONNECT BY LEVEL <= LAST_DAY(dt) - dt + 1
)
SELECT d.dept
     , d.dname
     , c.dt
     , COUNT(l.dt) cnt
  FROM deptmst d
 CROSS JOIN calendar c
  LEFT OUTER JOIN lunch l
    ON d.dept = l.dept
   AND c.dt   = l.dt
 GROUP BY d.dept, d.dname, c.dt
 ORDER BY d.dept, c.dt
;

 

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