수량만큼 행을 가져오는 방법이 있을까요? 0 2 722

by 혜당화 [SQL Query] [2017.04.24 15:25:15]


일단 데이터는 10건이 있습니다.

품번 수량
A001 4
A001 4
A001 4
A001 4
A001 4

와 같은 데이터가 있을 때 사용자가 13이라고 입력하면

해당 테이블에서 4건데이터를 들고오는것과  4건을 들고왔을경우

마지막행은 16-13 이므로 수량이 3 남았다는것을 알고 싶습니다.

로직으로 처리하면 되는데 오라클 기능상 충분히 지원할 것 같아 여쭈어 봅니다.

by chrome [2017.04.24 17:54:24]

WITH TB AS (
SELECT  'A001' AS PNO, 4 AS AMT FROM DUAL UNION ALL 
SELECT 'A001' AS PNO, 4 AS AMT FROM DUAL UNION ALL 
SELECT 'A001' AS PNO, 4 AS AMT FROM DUAL UNION ALL 
select 'A001' as pno, 4 as amt from dual union all 
SELECT 'A001' AS PNO, 4 AS AMT FROM DUAL UNION ALL 
SELECT 'A001' AS PNO, 4 AS AMT FROM DUAL UNION ALL 
select  'A002' as pno, 8 as amt from dual 
)
SELECT A.*, A.SUM_AMT - 13 
FROM (
SELECT  A.*,
NVL(LAG(SUM_AMT) OVER(PARTITION BY PNO ORDER BY RN),0) AS CHECK_SUM  -- 합계를 만족시키는 최종 ROW확인을 위해 이전 ROW의 합산값을 가져옴
from (
SELECT 
A.* , 
SUM(AMT) OVER(PARTITION BY PNO ORDER BY PNO ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS SUM_AMT,
ROW_NUMBER() OVER(PARTITION BY PNO ORDER BY  PNO) AS RN -- 순서 구분을 위해 생성
FROM TB A 
) A
) A
WHERE /* 합계를 채우지 못한 대상도 출력 */ (A.CHECK_SUM - 13 < 0) OR 
/* 합계를 만족시키는 최종 ROW 출력  */ ( (A.CHECK_SUM - 13 )  < 0 AND (A.SUM_AMT - 13) >= 0)
--and pno = 'A001'
;

 

 


by 마농 [2017.04.24 18:34:13]

정렬 기준 항목이 필요한 문제입니다.

WITH t AS
(
SELECT 'A001' cd, 1 seq, 4 cnt FROM dual
UNION ALL SELECT 'A001', 2, 4 FROM dual
UNION ALL SELECT 'A001', 3, 4 FROM dual
UNION ALL SELECT 'A001', 4, 4 FROM dual
UNION ALL SELECT 'A001', 5, 4 FROM dual
)
SELECT cd, seq, cnt
     , GREATEST(sum_cnt - v_cnt, 0) cnt_rem
  FROM (SELECT cd, seq, cnt
             , SUM(cnt) OVER(PARTITION BY cd ORDER BY seq) sum_cnt
             , 13 v_cnt
          FROM t
         WHERE cd = 'A001'
        )
 WHERE sum_cnt - cnt < v_cnt
;

 

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