안녕하세요! 질문이 있어서 글을 올리게 되었습니다.
SA_PROCESS 테이블은 VIN(차량 번호), START_DT(작업 시작일), END_DT(작업 종료일) 등 차량에 대한 작업 정보가 담겨있습니다.
SA_VEHIC_VIEW는 차량에 대한 정보가 담겨 있으며 PK는 VIN(차량 번호)입니다.
제가 원하는 쿼리는 10월 1일부터 10월 31일 까지 차량 별 총 작업일 수를 구하는 것입니다.
FROM 절 안에서 A.VIN을 가져올 수 가 없어서 오류가 나네요...
며칠 째 고민하고 있는데 풀리지가 않네요ㅜㅠ
2개월 된 신입이라 쿼리가 미숙한 점 양해 부탁드립니다. 도와주세요..
SELECT A.*,
(SELECT COUNT(DISTINCT TO_CHAR (TO_DATE (SDT, 'YYYY-MM-DD') + LEVEL - 1, 'YYYY-MM-DD')) AS CNT
FROM (SELECT VIN,
TO_CHAR (
CASE
WHEN START_DT < TO_DATE ('2022-10-01' , 'YYYY-MM-DD') THEN TO_DATE ('2022-10-01' , 'YYYY-MM-DD')
ELSE START_DT
END, 'YYYY-MM-DD' ) SDT,
NVL (TO_CHAR (END_DT, 'YYYY-MM-DD'), '2022-10-31') EDT
FROM SA_PROCESS
WHERE VIN = A.VIN
AND START_DT < TO_DATE ('2022-11-01' , 'YYYY-MM-DD')
AND (END_DT >= TO_DATE ('2022-10-01' , 'YYYY-MM-DD') OR END_DT IS NULL))
CONNECT BY LEVEL <= ( TO_DATE (EDT, 'YYYY-MM-DD') - TO_DATE (SDT, 'YYYY-MM-DD') + 1)
)
FROM SA_VEHIC_VIEW A
with vw_rows as ( select t1.VIN, to_char(t1.START_DT+lev-1, 'yyyymmdd') dt from SA_PROCESS t1, (select level lev from dual connect by level <= (select sysdate - min(START_DT)+1 from SA_PROCESS)) t2 where nvl(t1.END_DT, sysdate) - t1.START_DT + 1 >= lev ) , vw_data as ( select VIN, count(dt) cnt from vw_rows t where dt between '20221001' and '20221031' group by VIN ) select t2.*, t1.cnt from vw_data t1, SA_VEHIC_VIEW t2 where t1.VIN = t2.VIN
와.. 제가 원하던 결과가 나오네요 정말 감사합니다!! 많이 배워갑니다!!
SELECT a.*
, NVL(b.cnt, 0) cnt
FROM sa_vehic_view a
LEFT OUTER JOIN
(SELECT vin
, SUM( LEAST ( TO_DATE('2022-10-31', 'yyyy-mm-dd')
, NVL(end_dt, TO_DATE('2022-10-31', 'yyyy-mm-dd')))
- GREATEST( TO_DATE('2022-10-01', 'yyyy-mm-dd'), start_dt)
+ 1) cnt
FROM sa_process
WHERE start_dt <= TO_DATE('2022-10-31', 'yyyy-mm-dd')
AND (end_dt >= TO_DATE('2022-10-01', 'yyyy-mm-dd') OR end_dt IS NULL)
GROUP BY vin
) b
ON a.vin = b.vin
;
와!! 많이 배워갑니다! 정말 감사합니다!!