숫자더하기 빼기 합 0 3 3,506

by 초코초코 [Oracle 기초] [2015.01.19 09:20:25]


저번주 문의 드렸던 사항인데요 , 한번더 문의 드리겠습니다.

  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 
       )

부디 어린양에게 도움을 주시기 바랍니다.

고맙습니다..

by 정규직 [2015.01.19 09:57:06]

원하시는 답인지 모르겠네요.

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));


by lovekod2hj [2015.01.19 11:30:15]

with 문구는 테이블을 대신해서 들어간 문장입니다.

select 위쪽은 테이블이 있으면 대체하시면 됩니다.

원하시는 것을 처리하는 방법은 여러가지가 있을텐데 제

윈도우즈 함수 부분을 읽어 보시고 하시면 좀 더 쉬울 듯합니다.

http://wiki.gurubee.net/pages/viewpage.action?pageId=26744104


by 초코초코 [2015.01.19 13:16:32]

정규직님 러브님 고맙습니다.

윈도우즈 함수 부분이 많은 도움이 되고 있습니다.

어서 무럭 무럭  자라야 할텐데 ,,,,,

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