저번주 문의 드렸던 사항인데요 , 한번더 문의 드리겠습니다.
A B
가 5 5
나 20 15
다 5 0
합 30 20
가 항목은 필수
(가+나+다) 를 더 하여 20미만으로 만들고 , 합 20
가+나 = 20이 넘으면 다는 숫자가 있어도 0 으로 하여 합 20 으로
가+나 20이 안넘으면 다 항목을 더하여 20으로 합 20
가+나+다 20 안넘으면 합을 20
저번주 러브님께서 도움 주셔서 해보았는데 여러방향으로 해보았지만 , 계속 합이 0으로 만 나오더라구요.
아래 구문은 러브님이 도움주신 내용입니다 ,
그리고 / with 방법 말고 select , where 로 힘든지요 ,, /
WITH TMP AS (
SELECT 1 AS RNUM, 5 AS A FROM DUAL UNION ALL
SELECT 2 , 10 FROM DUAL UNION ALL
SELECT 3 , 15 FROM DUAL UNION ALL
SELECT 4 , 20 FROM DUAL
)
SELECT RNUM, A
, CASE WHEN CURRENT_A_SUM <= 20 THEN A
WHEN CURRENT_A_SUM - A >= 20 THEN 0
ELSE A - (CURRENT_A_SUM - 20) END B
FROM (
SELECT RNUM
, A
, SUM(A) OVER (ORDER BY RNUM) AS CURRENT_A_SUM
FROM TMP
)
부디 어린양에게 도움을 주시기 바랍니다.
고맙습니다..
원하시는 답인지 모르겠네요.
WITH TMP AS (
SELECT '가' AS RNUM, 5 AS A FROM DUAL UNION ALL
SELECT '나' , 20 FROM DUAL UNION ALL
SELECT '다' , 5 FROM DUAL
)
SELECT CASE WHEN GROUPING_ID(RNUM) = 1 THEN '합' ELSE RNUM END AS RNUM,
CASE WHEN GROUPING_ID(RNUM) = 1 THEN SUM(A) ELSE A END AS A,
CASE WHEN GROUPING_ID(RNUM) = 1 THEN SUM(AMT) ELSE AMT END AS AMT
FROM (SELECT RNUM,
A,
GREATEST(LEAST(20, A, 20-A_SUM + A),0) AS AMT
FROM (SELECT RNUM,
A,
SUM(A) OVER (ORDER BY RNUM) AS A_SUM
FROM TMP))
GROUP BY ROLLUP((RNUM, A, AMT));