select loctval, srno , substr(inpdttm,0,8) as cdate, count(*) as imagecount from ximg where ximg.inpdttm>20230101 and ximg.inpdttm<20230301 and loctval='seoul' and ximg.tpcd='v' group by substr(inpdttm, 0,8), loctval, srno
해당 쿼리에서 만약 srno값이 10,20,30,40,50이 있는데 조회한 날짜에 10이 없어서 imagecount에 0으로 표기되게 할려면 어떻게 해야하나요?
현재 쿼리로는 데이터가 없다보니 아에 빠져버리네요..
제 질문이 어려웟나요?
만약 어떤 날에는 5개 코드 다 없다면? 해당 일자는 나와야 할까요? 안나와도 될까요?
그냥 원하는 결과표를 표로 그려주실 수 있나요?
예를 들어 1일부터 3일까지 기간으로 조회하는데
1일에는 5개 코드 다 있고
2일에는 4개 코드 만 있고
3일에는 아무것도 없다면?
결과가 어떻게 나와야 할까요?
(1안 : 없는 날짜는 안나와도 된다.)
seoul 1일 10 1개
seoul 1일 20 1개
seoul 1일 30 1개
seoul 1일 40 1개
seoul 1일 50 1개
seoul 2일 10 1개
seoul 2일 20 1개
seoul 2일 30 1개
seoul 2일 40 0개
seoul 2일 50 1개
(2안 : 없는 날짜도 나와야 된다.)
seoul 1일 10 1개
seoul 1일 20 1개
seoul 1일 30 1개
seoul 1일 40 1개
seoul 1일 50 1개
seoul 2일 10 1개
seoul 2일 20 1개
seoul 2일 30 1개
seoul 2일 40 0개
seoul 2일 50 1개
seoul 3일 10 0개
seoul 3일 20 0개
seoul 3일 30 0개
seoul 3일 40 0개
seoul 3일 50 0개
loctval | srno | cdate | imagecount |
seoul | 10 | 20230102 | 0 |
seoul | 10 | 20230103 | 0 |
seoul | 10 | 23230104 | 0 |
seoul | 20 | 20230102 | 12 |
seoul | 20 | 20230103 | 23 |
seoul | 20 | 20230104 | 48 |
seoul | 30 | 20230102 | 30 |
seoul | 30 | 20230103 | 21 |
seoul | 30 | 20230104 | 11 |
위의 테이블처럼 특정 날짜에 데이터가 없어서 아에 srno 10을 조회할 수 없을 때 강제로 srno 10 에 특정컬럼 imagecount를0으로 표시해주길 원한겁니다.
WITH ximg AS ( SELECT 'seoul' loctval, 20 srno, '20230102000000' inpdttm, 'v' tpcd FROM dual UNION ALL SELECT 'seoul', 20, '20230103010000', 'v' FROM dual UNION ALL SELECT 'seoul', 20, '20230103020000', 'v' FROM dual UNION ALL SELECT 'seoul', 20, '20230104010000', 'v' FROM dual UNION ALL SELECT 'seoul', 20, '20230104020000', 'v' FROM dual UNION ALL SELECT 'seoul', 20, '20230104030000', 'v' FROM dual UNION ALL SELECT 'seoul', 30, '20230102000000', 'v' FROM dual UNION ALL SELECT 'seoul', 30, '20230103000000', 'v' FROM dual UNION ALL SELECT 'seoul', 30, '20230104000000', 'v' FROM dual ) SELECT a.loctval , a.srno , b.cdate , COUNT(c.srno) imagecount FROM (SELECT 'seoul' loctval , LEVEL * 10 srno FROM dual CONNECT BY LEVEL <= 3 ) a CROSS JOIN (SELECT TO_CHAR(sdt + LEVEL - 1, 'yyyymmdd') cdate FROM (SELECT TO_DATE('20230102', 'yyyymmdd') sdt , TO_DATE('20230104', 'yyyymmdd') edt FROM dual ) CONNECT BY LEVEL <= edt - sdt + 1 ) b LEFT OUTER JOIN (SELECT loctval , srno , SUBSTR(inpdttm, 1, 8) cdate FROM ximg WHERE loctval = 'seoul' AND tpcd = 'v' AND inpdttm >= '20230102' || '000000' AND inpdttm <= '20230104' || '235959' ) c ON a.loctval = c.loctval AND a.srno = c.srno AND b.cdate = c.cdate GROUP BY a.loctval, a.srno, b.cdate ORDER BY a.loctval, a.srno, b.cdate ;