이월계산문의드립니다(누적??)
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 쓰면 될거 같은데 여러가지 케이스를 도입하면 원하는 금액이 안나옵니다...
부탁드립니다.^^
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 ) ;