차량별 작업일수를 구하고 싶습니다.도와주세요 ㅠㅜ 1

by 초보자 [SQL Query] [2022.11.04 13:53:35]


안녕하세요! 질문이 있어서 글을 올리게 되었습니다.

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
by 최양락 [2022.11.04 15:58:44]
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

 


by 초보자 [2022.11.07 08:58:36]

와.. 제가 원하던 결과가 나오네요 정말 감사합니다!! 많이 배워갑니다!!


by 마농 [2022.11.07 09:11:29]
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
;

 


by 초보자 [2022.11.08 08:45:05]

와!! 많이 배워갑니다! 정말 감사합니다!!

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