쿼리 도움 부탁드려요 0 1 937

by 2016년신입 [SQL Query] Query History 쿼리 [2017.12.08 17:45:51]


       SEQ    MODEL    FLAG    PRO_DATE
1    00001    SS1    out    20170101
2    00002    SS1    in    20170201
3    00003    SS2    out    20170501
4    00004    SS1    out    20170501
5    00005    SS2    in    20171101
6    00006    SS1    in    20170901
7    00007    SS1    out    20171001
8    00008    SS1    in    20171101
9    00009    SS1    out    20171102
10    00010    SS1    in    20171201
11    00011    SS3    out    20171201
12    00012    SS2    out    20171201
13    00013    SS2    in    20171221
14    00014    SS3    in    20171221
 

-----------------------------------------------------------------------------------------


WITH TEMP AS
(
SELECT '00001' seq, 'SS1' model, 'out' flag, '20170101' pro_date FROM dual UNION ALL
SELECT '00002',    'SS1',        'in',       '20170201' FROM dual UNION ALL
SELECT '00003',    'SS2',        'out',      '20170501' FROM dual UNION ALL
SELECT '00004',    'SS1',        'out',      '20170501'  FROM dual UNION ALL
SELECT '00005',    'SS2',        'in',       '20171101' FROM dual UNION ALL
SELECT '00006',    'SS1',        'in',       '20170901'  FROM dual  union all

SELECT '00007',    'SS1',        'out',      '20171001' FROM dual UNION ALL
SELECT '00008',    'SS1',        'in',       '20171101' FROM dual UNION ALL
SELECT '00009',    'SS1',        'out',      '20171102'  FROM dual UNION ALL
SELECT '00010',    'SS1',        'in',       '20171201' FROM dual UNION ALL
SELECT '00011',    'SS3',        'out',      '20171201' FROM dual UNION ALL
SELECT '00012',    'SS2',        'out',      '20171201'  FROM dual UNION ALL
SELECT '00013',    'SS2',        'in',       '20171221' FROM dual UNION ALL
SELECT '00014',    'SS3',        'in',       '20171221' FROM dual 

SELECT * from temp

--------------------------------------------------------------------------------------------

위와 같은 테이블이 있습니다.

 

각 모델들은 출고 입고가 반복되는 히스토리 테이블 인데

출고와 입고 사이의 날짜를 모두 더하여 쿼리를 출력 하고 싶은데 도통 생각이 떠오르지 않아서요, 

flag가 in만 읽어서 해당 날짜들을 그룹하여, in보다 작은 OUT 중에 max를 읽어서 하면 될 것 같은데, 그렇게 하면 너무 복잡해 지는 것 같아 혹시 다른 방안이 있는지 지식 공유좀 부탁드립니다.

 

계산은 SS2의 경우를 예로 들면

out 20170501

in 20171101

out 20171201

in 20171221

이 있으면 첫번째 와 두번째 out과 in 의 사이 일자를 더하여 180일+ 20일 = 200일 

이런식으로 계산하여 조회를 하고 싶습니다.

그럼 SS2 200일

      SS3 20일

     SS1 209일 

이런식으로요 

 

by 마농 [2017.12.08 18:20:13]

일수 계산시 + 1 을 할지 말지 결정하세요.

SELECT model
     , SUM(edt - sdt    ) cnt1
     , SUM(edt - sdt + 1) cnt2
  FROM (SELECT model, flag
             , TO_DATE(LAG(pro_date) OVER(PARTITION BY model ORDER BY seq), 'yyyymmdd') sdt
             , TO_DATE(pro_date, 'yyyymmdd') edt
          FROM temp
        )
 WHERE flag = 'in'
 GROUP BY model
;

 

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