누적 차감관련 질문드립니다. 0 6 1,306

by zbra [SQL Query] [2017.11.10 15:18:20]


WITH T AS (
SELECT '10000' KEY_VAL, 1 SEQ, 420 QTY FROM DUAL UNION ALL
SELECT '10000' KEY_VAL, 2 SEQ, 420 QTY FROM DUAL UNION ALL
SELECT '10000' KEY_VAL, 3 SEQ, 420 QTY FROM DUAL UNION ALL
SELECT '10000' KEY_VAL, 4 SEQ, 420 QTY FROM DUAL UNION ALL
SELECT '10000' KEY_VAL, 5 SEQ, 420 QTY FROM DUAL 
)
SELECT * 
  FROM T
  ;
KEY_VAL SEQ QTY
10000 1 420
10000 2 420
10000 3 420
10000 4 420
10000 5 420

위와같은 데이터를 기준값만큼만 데이터가 나오도록 차감시키고 싶습니다.

QTY2의 합은 기준값 (예시 : 1290) 이 됩니다.

결과는 아래와 같습니다.

KEY_VAL SEQ QTY1 QTY2
10000 1 420 420
10000 2 420 420
10000 3 420 420
10000 4 420 30
10000 5 420 0

 

OVER문을 이용하면 금방나오겠다 생각했는데, 

아직 내공이 많이 부족한것 같습니다.

선배님들의 조언을 얻고싶습니다.

by 랑에1 [2017.11.10 15:44:26]

SELECT KEY_VAL, SEQ, QTY, DECODE(SIGN(QTY2), -1, 0, QTY2) QTY2
FROM   ( SELECT  T.*
               , CASE WHEN SUM(QTY) OVER(ORDER BY seq) < 1290 THEN QTY
                      ELSE 1290 - (SUM(QTY) OVER(ORDER BY seq) - QTY) END QTY2
       FROM     T
       )

검증은 안해봤습니다 ㅎㅎ

 


by zbra [2017.11.10 15:50:27]

제가 원하는 데이터가 잘 나오네요.

제가 너무 복잡하게만 생각하고있었던건 아닌가 싶습니다.

('SIGN 함수를 저렇게 사용하는구나' 도 배웠습니다.)

SELECT KEY_VAL, SEQ
      ,QTY1 
      ,LEAST(QTY1, QTY2, QTY3 - QTY2) V1
  FROM (
        SELECT KEY_VAL, SEQ
              ,QTY QTY1
              --,SUM(QTY) OVER(ORDER BY SEQ) QTY2
              ,SUM(QTY) OVER(ORDER BY SEQ ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) QTY2
              ,1290 QTY3
          FROM T
       )
;

이것저것 해본다고 여기저기찾아서 이렇게까지 했는데 원하는게 안나와서 한참을 붙들고있었네요.

정말 감사드립니다. 즐거운 주말되세요.


by 랑에1 [2017.11.10 15:57:12]

맞아요 너무 복잡하게 생각 안하는게 좋은것 같아요

저도 그걸 잘 못합니다 허허..

즐거운 주말 되세요


by 마농 [2017.11.10 17:24:43]
SELECT key_val, seq
     , qty1
     , GREATEST(LEAST(qty1, qty3 - qty2 + qty1), 0) qty2
  FROM (SELECT key_val, seq
             , qty qty1
             , SUM(qty) OVER(PARTITION BY key_val ORDER BY seq) qty2
             , 1290 qty3
          FROM t
        )
;

 


by zbra [2017.11.10 18:08:12]

오오 제가 구현하고싶었던 방식이네요.(사실 그것도 마농님 과거 댓글내용 참조해서 하려고했던..)

짜주신걸 읽어보면 잘 할수있을꺼같은데 막상해보면 잘 안되네요.

댓글남길만큼 더 열심히 공부하겠습니다.

정말감사합니다~!!


by 고수가되고싶어요 [2017.12.07 13:52:17]
WITH T AS (
SELECT '10000' KEY_VAL, 1 SEQ, 420 QTY FROM DUAL UNION ALL
SELECT '10000' KEY_VAL, 2 SEQ, 420 QTY FROM DUAL UNION ALL
SELECT '10000' KEY_VAL, 3 SEQ, 420 QTY FROM DUAL UNION ALL
SELECT '10000' KEY_VAL, 4 SEQ, 420 QTY FROM DUAL UNION ALL
SELECT '10000' KEY_VAL, 5 SEQ, 420 QTY FROM DUAL 
)
SELECT KEY_VAL
	  ,SEQ
      ,QTY
      ,CASE WHEN GB < 1290 THEN QTY 
      		WHEN (1290 - LAG(GB) OVER(ORDER BY SEQ) )<0 THEN 0
      		WHEN GB > 1290 THEN 1290 -LAG(GB) OVER(ORDER BY SEQ)END   QTY2
FROM(SELECT key_val
	  ,SEQ
      ,qty
	  , SUM(qty) OVER(ORDER BY seq) GB
      FROM T )

 

저도해봤는데 이렇게하는건 안되나여

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