이월계산문의드립니다(누적차감??) 0 2 782

by lgxj20 [2019.02.13 15:39:17]


이월계산문의드립니다(누적??)
                  
                  ex)1.
                  대상갑이 655526 이라고 했을떄
                  
                  1 행의 로우값 1118000
                  2 행의 로우값 1185000
                  3 행의 로우값 2000000
                  
                  이라 했을때
                  
                  계산순서는 로우행 순으로 
                  1행의 로우 결과 값은 1118000 - 655526 = 462474
                  2행의 로우 결과 값은 1185000 - 0 = 1185000    (이미 대상값이 1행에 다 계싼되었기때문에)
                  3행의 로우 결과 값은 2000000 - 0 = 2000000    (이미 대상값이 1행에 다 계싼되었기때문에)
                  
                  
                  ex)2.
                  대상갑이 2000000 이라고 했을떄
                  
                  1 행의 로우값 1118000
                  2 행의 로우값 1185000
                  3 행의 로우값 2000000
                  
                  이라 했을때
                  
                  계산순서는 로우행 순으로 
                  1행의 로우 결과 값은 1118000 - 2000000 = 0
                  2행의 로우 결과 값은 1185000 - (2000000-1118000) = 1185000 - (303000) =  882000   (1행에 계산되고 남은 303000원을 1행의 로우삾에서 차감)
                  3행의 로우 결과 값은 2000000 - 0 = 2000000    (이미 대상값이 12에 다 계싼되었기때문에)
                  
                                    
                                    
                  ex)2.
                  대상갑이 3500000 이라고 했을떄
                  
                  1 행의 로우값 1118000
                  2 행의 로우값 1185000
                  3 행의 로우값 2000000
                  
                  이라 했을때
                  
                  계산순서는 로우행 순으로 
                  1행의 로우 결과 값은 1118000 - 3500000 = 0
                  2행의 로우 결과 값은 1185000 - (3500000-1118000) = 1185000 - (2382000) =  0 
                  3행의 로우 결과 값은 2000000 - (3500000-1118000-1185000) = 2000000 - (1197000) = 803000
                  
                  이런식으로 계산 되하려고 합니다.

생각하보면 sum()over 쓰면 될거 같은데 여러가지 케이스를 도입하면 원하는 금액이 안나옵니다...

부탁드립니다.^^

by 마농 [2019.02.13 16:18:10]
WITH t AS
(
SELECT 1 rn, 1118000 amt FROM dual
UNION ALL SELECT 2, 1185000 FROM dual
UNION ALL SELECT 3, 2000000 FROM dual
)
, ex AS
(
SELECT 1 ex, 655526 ex_amt FROM dual
UNION ALL SELECT 2, 2000000 FROM dual
UNION ALL SELECT 3, 3500000 FROM dual
)
SELECT rn
     , amt
     , s_amt
     , ex_amt
     , use_amt
     , amt - use_amt rem_amt
  FROM (SELECT rn
             , amt
             , s_amt
             , ex_amt
             , CASE WHEN s_amt       < ex_amt THEN amt
                    WHEN s_amt - amt < ex_amt THEN ex_amt - s_amt + amt
                    ELSE 0
                END AS use_amt
--           , GREATEST(LEAST(amt, ex_amt, ex_amt - s_amt + amt), 0) use_amt
          FROM (SELECT rn, amt
                     , SUM(amt) OVER(ORDER BY rn) s_amt
                  FROM t
                )
             , ex
         WHERE ex = 3
        )
;

 


by lgxj20 [2019.02.13 16:57:57]

감사합니다.

분석해보겠습니다.

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