-- 제시된 금액(8)을 첫번째 레코드부터 순차적으로 차감하기

SELECT  T.PRC
,       SUM(T.PRV_PRC) OVER (ORDER BY ROWNUM)                                                                                           AS COL1 -- 이전금액까지의 차감한 누적액
,       8 - SUM(T.PRV_PRC) OVER (ORDER BY ROWNUM)                                                                                       AS COL2 -- 이전레코드까지 차감한 결과 즉 현재 레코드에 차감해야 할 금액
,       T.PRC - LEAST(DECODE(SIGN(8 - SUM(T.PRV_PRC) OVER (ORDER BY ROWNUM)), -1, 0, 8 - SUM(T.PRV_PRC) OVER (ORDER BY ROWNUM)), T.PRC) AS COL3 -- 차감된 값 (마지막 레코드 마이너스 안되게)

,       T.PRC - 
        CASE WHEN ROWNUM = COUNT(*) OVER ()
            THEN DECODE(SIGN(8 - SUM(T.PRV_PRC) OVER (ORDER BY ROWNUM)), -1, 0, 8 - SUM(T.PRV_PRC) OVER (ORDER BY ROWNUM))
            ELSE LEAST(8 - SUM(T.PRV_PRC) OVER (ORDER BY ROWNUM), T.PRC)
        END                                                                                                                             AS COL4 -- 차감된 값 (마이너스 값 있게)

FROM (  SELECT  LEVEL AS PRC
        ,       LAG(LEVEL, 1, 0) OVER (ORDER BY ROWNUM) AS PRV_PRC  -- 이전금액
        FROM DUAL
        CONNECT BY LEVEL < 5) T;
        

 

안쪽 쿼리 중간집합

 

결과 집합