정말 궁금합니다. 1 9 1,766

by 하수 [2009.07.20 17:19:15]


WITH a AS
     (SELECT 'A' col1,
             10 col2
        FROM dual
      UNION ALL
      SELECT 'B' col1,
             20 col2
        FROM dual
      UNION ALL
      SELECT 'C' col1,
             10 col2
        FROM dual
      UNION ALL
      SELECT 'D' col1,
             30 col2
        FROM dual)
SELECT   col1,
         col2,
         SUM(decode(col1, 'A',a1+A2,'B',A1+A2,'C',A1+A2+A3))  A
    FROM (SELECT col1,
                 col2,
                 decode(col1, 'A', col2) a1,
                 decode(col1, 'B', col2) a2,
                 decode(col1, 'C', col2) a3
            FROM (SELECT col1,
                         col2
                    FROM (SELECT substr(a, 1, 1) col1,
                                 substr(a, 2) col2
                            FROM (SELECT   decode(col1, 'A', col1 || col2, 'B', col1 || col2, 'C', col1 || col2) a,
                                           decode(col1, 'A', SUM(col2)) a1,
                                           decode(col1, 'B', SUM(col2)) a2,
                                           decode(col1, 'C', SUM(col2)) a3
                                      FROM a
                                  GROUP BY col1,
                                           col2))
                   WHERE col1 IS NOT NULL) a)
GROUP BY col1,
         col2

-----------------------------------------------------------------------------------------------------------------

COL1 COL2 SUM(DECODE(COL1,'A',A1+A2))

A 10 
B 20 
C 10 
-------------------------------------------------------------------------자  왜 컴럼의 값이 안나오나요?------------------------

정말 이것때문에 열받아 죽겟어요 ㅠㅠ 고수님들 헬플미

 

by 권빵 [2009.07.20 17:42:21]
DECODE 문을
DECODE(COL1, 'A', COL2, 0) A1,
DECODE(COL1, 'B', COL2, 0) A2,
DECODE(COL1, 'C', COL2, 0) A3
이렇게 바꾸어 보세요..
DECODE else 값 0

by 권빵 [2009.07.20 17:44:00]
쉽게 설명하자면
select 1 + 0 from dual
union all
select 1 + '' from dual
이걸 참고하세요 ^^

by 하수 [2009.07.20 17:44:10]
안녕하세요 ㅋㅋ 답변감사합니다. 근데 제가원하는값은
A =10 B=30 C=40 인데....값이 다르네요 흑흑 도와주셔요 ㅠ

by 하수 [2009.07.20 17:45:51]
음 널값과 더해지면 널이된다.. 하지만 A1 A2는 둘다값이있는데...흠...

by 마농 [2009.07.20 17:58:57]
혹시 이런걸 원하시나요? 누적합계?
WITH a AS
(
SELECT 'A' col1, 10 col2 FROM dual
UNION ALL SELECT 'B', 20 FROM dual
UNION ALL SELECT 'C', 10 FROM dual
UNION ALL SELECT 'D', 30 FROM dual
)
SELECT col1
, SUM(col2) OVER(ORDER BY col1) col2
FROM a
WHERE col1 IN ('A','B','C')
;

by 하수 [2009.07.20 18:02:50]
아 감사합니다 마농님 이걸원한건데요 ^^

제가 한 풀이법에대한 잘못된점을 듣고싶어서요 ..

제머리로는 저게 왜 널값이되는지 흠....

by 마농 [2009.07.20 23:08:14]
일단은 단순하게 조회해도 되는 쿼리를 너무나도 복잡하고 불필요한 단계를 거쳐서 조회했구요.
일단 복잡한 쿼리의 서브쿼리 부분만 단순화 시켜보면 다음과 같구요
SELECT col1, col2
, DECODE(col1,'A',col2) a1
, DECODE(col1,'B',col2) a2
, DECODE(col1,'C',col2) a3
FROM a
;
이것의 결과는 다음과 같구요.
c1| c2 | a1 | a2 | a3
A | 10 | 10 | __ | __
B | 20 | __ | 20 | __
C | 10 | __ | __ | 10
이 결과를 인라인뷰로 하여 계산한 a1 + a2 + a3 의 값은
각각의 레코드에 대해
A : 10 + null + null 로 결과는 null입니다.
B : null + 20 + null 로 결과는 null입니다.
C : null + null + 10 로 결과는 null입니다.
널값이 연산에 포함되면 결과는 무조건 널입니다.
님께서 처리하신 방식으로는 레코드간을 넘나들면서 연산 하실 수 없습니다.
우선은 그룹함수에 대한 이해가 선행된 후에 분석함수에 대해서 공부해 보세요.

by 도가니 [2009.07.21 10:20:29]
마농님의 쿼리보고 많이 배우고 있습니다,,전 원시적인 방법으로 만들어 봤습니다..
WITH a AS (
SELECT 'A' col1, 10 col2 FROM dual UNION ALL
SELECT 'B' col1, 20 col2 FROM dual UNION ALL
SELECT 'C' col1, 10 col2 FROM dual UNION ALL
SELECT 'D' col1, 30 col2 FROM dual
)
SELECT COL1, SUM(COL2) SUM_COL2 FROM (
SELECT A.COL1, CASE WHEN A_NO >= B_NO THEN SUM(B.COL2) END COL2
FROM (SELECT A.*, ROWNUM A_NO FROM A) A,
(SELECT A.*, ROWNUM B_NO FROM A) B
GROUP BY A.COL1, A_NO, B_NO
) GROUP BY COL1
ORDER BY 1
;

by 하수 [2009.07.22 09:47:16]
모두모두 감사합니다 ^^ 감이오네요 ㅋㅋㅋㅋ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입