sql 질문입니다 ㅠ 0 2 1,174

by 열정가이 [Oracle 기초] [2018.12.26 17:25:38]


캡처.PNG (33,638Bytes)

안녕하세요.. 사회초년생 개발자입니다..

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만 사용해서 가능할까요?ㅠ

by 마농 [2018.12.26 17:46:56]

전반적으로 비효율이 느껴지고, 쿼리 해석이 힘드네요.
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 이 필요합니다.


by 열정가이 [2018.12.26 17:53:06]

Partition Outer Join 에 대해 공부해봐야겠네요...!!

마농님 좋은 피드백 감사합니다!! 잘 배워서 더 좋은 쿼리를 작성할 수 있는 개발자가 되겠습니다!!

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