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으로 표기되게 할려면 어떻게 해야하나요?
현재 쿼리로는 데이터가 없다보니 아에 빠져버리네요..
DB 종류 및 버전 알려주세요.
혹시 10,20,30,40,50 에 대한 코드테이블이 별도로 있는지요?
만약 어떤 날에는 5개 코드 다 없다면? 해당 일자는 나와야 할까요? 안나와도 될까요?
inpdttm 에 대한 조건은 숫자와 비교하는데? (inpdttm < 20230301)
조회할 때는 문저처럼 잘라서 조회하네요? SUBSTR(inpdttm, 0, 8)
맞게 사용한 건가요? 뭔가 이상한데요?
inpdttm 의 데이터 타입이 뭔가요?
10,20,30 코드가 별도로 있는 테이블은 따로 없습니다. db는 티베로입니다. inpdttm은 varchar 타입인데 제가 착각해서 202300301235959 이런 식으로 썼어야 했는데 제가 잘못 체크했네요.
제가 질문한거 답한다면 srno를 group by로 잡아놓은 쿼리와 제가 질문한 쿼리와 join을 해야 될 거 같은데 맞을까요?
만약 어떤 날에는 5개 코드 다 없다면? 해당 일자는 나와야 할까요? 안나와도 될까요?
srno컬럼이 10, 날짜컬럼 20230102 이고 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
;