안녕하세요.. 사회초년생 개발자입니다..
SQL 작성하는 도중 모르는게 생겨 이렇게 도움을 청하고자 글을 남기게 되었습니다...
다음과 같은 사진이 있을때 , 쿼리는 다음과 같습니다.
SELECT
(SELECT DNISNAME FROM U_IVRDNISINFO WHERE DNIS = U.DNIS) AS DNIS,
CASE STEP WHEN 1 THEN U.SERVICECODENAME
WHEN 2 THEN ' ' || U.SERVICECODENAME
WHEN 3 THEN ' ' || U.SERVICECODENAME
WHEN 4 THEN ' ' || U.SERVICECODENAME
WHEN 5 THEN ' ' || U.SERVICECODENAME
END AS CODE,
YMD AS TIMESTAMP,
COUNT AS OFFER,
U.SORT AS SORT
FROM H_IVRSVC_D H JOIN U_IVRSERVICECODEINFO U
ON H.DID = U.DNIS
AND U.SERVICECODE = H.svc
WHERE (YMD >= '20180901' AND YMD <= '20180930')
AND TO_CHAR(timestamp, 'HH24:MI') >= '00:00'
AND TO_CHAR(timestamp, 'HH24:MI') <= '24:00'
AND U.DNIS || ';' || U.TENANT IN('2000;DEFAULT', '2071;DEFAULT', '2230;DEFAULT', '2250;DEFAULT');
이때, 사진에서 보면 CODE 값이 초기인 값이 20180916까지 밖에 없는데 20180930까지 초기 값을 만들어주고싶습니다
그래서 OUTER JOIN을 생각하고 있는데, 그렇다면 TIMESTAMP 값이 NULL이 나올텐데 , 또 TIMESTAMP 값은 NULL이 아닌 17,18,19 이렇게 증가하는 값으로 하고 싶습니다. SQL만 사용해서 가능할까요?ㅠ
전반적으로 비효율이 느껴지고, 쿼리 해석이 힘드네요.
1. 컬럼명 앞에 테이블명. 을 안적어서 어떤 테이블의 항목인지 알 수 없네요.
- u. 이 없는 항목들은 다 h. 으로 보면 될까요?
2. ymd AS timestamp 했는데? 조건절에 timestamp 가 있네요?
- select 절의 별칭을 조건절에서 쓸 수 없는데? timestamp 컬럼이 따로 있는건가 보네요?
3. 컬럼명이 예약어로 되어 있네요?
- timestamp, count, sort, step 등등
- 예약어를 컬럼명으로 사용하는 것은 좋지 않습니다.
4. '00:00' ~ '24:00' 조건을 줬는데?
- 이 범위를 벗어나는 값이 있어서 조건을 준건가요?
- 굳이 줄 필요가 없는 조건 같아서요.
5. IN 조건을 주면서 컬럼을 가공하는데?
- 컬럼을 가공하는 것 보다는 조건값을 가공하는 게 좋습니다.
- AND (u.dnis, u.tenant) IN (('2000','DEFAULT'), ('2071','DEFAULT'), ('2230','DEFAULT'), ('2250','DEFAULT'))
- 또한 DEFAULT 가 공통 조건이라면? 이는 그냥 따로 빼는게 좋겟는데요?
- AND u.dnis IN ('2000', '2071', '2230', '2250')
- AND u.tenant ='DEFAULT'
6. Case 문은
- LPAD 를 이용하면 간단하게 바꿀 수 있습니다.
- LPAD(' ', (step-1)*4, ' ') || u.servicecodename AS code
마지막으로. 질문하신 없는 자료도 나오게 하려면?
- 날짜 테이블을 미리 만들어 Outer Join 을 해야 하는데
- 일반적인 아우터 조인이 아니라 Partition Outer Join 이 필요합니다.