필요한 수량에 대한 데이터만 뽑아 올려면 어떻게 해야 할까요? 0 6 613

by 권오창 [SQL Query] [2019.01.30 13:10:01]


데이터가 아래와 같이 들어가 있습니다.

A    250    20190101
A    280    20190102
A    110    20190103
A    200    20190104
A    150    20190105
A    100    20190106

이중에 제가 A 아이템에 대해서 특정 수량만큼 요청이 되었을 때 (A 300)

날짜 순으로 A 250 짜리와 A 280 짜리만 조회되게 할 수 있을까요?

A 300이 요청인데 A 250이 선택되고 나머지 50이 다음것 A 280짜리에 선택되어서 2건이 조회입니다.

A가 550이 요청되면

A 250

A 280

A 110

이렇게 3개가 조회되어야 됩니다.

 

by 우리집아찌 [2019.01.30 13:39:47]
WITH T (ITEM , QTY , DT  ) AS (
SELECT 'A', 250 , '20190101' FROM DUAL UNION ALL
SELECT 'A', 280 , '20190102' FROM DUAL UNION ALL
SELECT 'A', 110 , '20190103' FROM DUAL UNION ALL
SELECT 'A', 200 , '20190104' FROM DUAL UNION ALL
SELECT 'A', 150 , '20190105' FROM DUAL UNION ALL
SELECT 'A', 100 , '20190106' FROM DUAL 
)
SELECT * 
  FROM (SELECT A.*
             , SUM(CASE WHEN SUM_QTY >= 550 THEN 1 ELSE 0 END ) OVER(PARTITION BY ITEM ORDER BY DT ) RN 
          FROM (SELECT T.*
                      ,SUM(QTY) OVER(PARTITION BY ITEM ORDER BY DT ) SUM_QTY 
                  FROM T
                ) A
        )       
  WHERE RN <= 1 

 


by 권오창 [2019.01.30 14:01:03]

음 합산값이 요청값보다 작으면 0 크면 1로 주어서 0인것만 추려내는 거군요

700일 경우

A 250
A 300
A 100
A 200

이 선별이 안되고 3개만 되는거 같습니다...

 


by 우리집아찌 [2019.01.30 14:08:43]

부등호 수정했습니다.


by 우리집아찌 [2019.01.30 14:10:14]

전 잘나오는데요.


by 마농 [2019.01.30 13:54:07]
WITH t AS
(
SELECT 'A' item, 250 qty, '20190101' dt FROM dual
UNION ALL SELECT 'A', 280, '20190102' FROM dual
UNION ALL SELECT 'A', 110, '20190103' FROM dual
UNION ALL SELECT 'A', 200, '20190104' FROM dual
UNION ALL SELECT 'A', 150, '20190105' FROM dual
UNION ALL SELECT 'A', 100, '20190106' FROM dual
)
SELECT a.item
     , a.qty
     , a.dt
     , a.s_qty
     , b.req_qty
     , LEAST(a.s_qty, b.req_qty) - (a.s_qty - a.qty) use_qty
     , a.qty
     - LEAST(a.s_qty, b.req_qty) + (a.s_qty - a.qty) rem_qty
  FROM (SELECT item, qty, dt
             , SUM(qty) OVER(PARTITION BY item ORDER BY dt) s_qty
          FROM t
        ) a
     , (SELECT 'A' item, 300 req_qty FROM dual) b
 WHERE a.item = b.item
   AND (a.s_qty - a.qty) < b.req_qty
;

 


by 권오창 [2019.01.30 14:10:21]

두분들 다 실력자이시군요. 전 쿼리를 보기 전까지 이생각을 못했네요

ㅠㅠ 존경스럽습니다. 또한 무지함에 배울것이 한참 멀었구나 싶네요

감사합니다~~

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