쿼리 질문드립니다. 0 6 762

by 쿼리를 정복하라 [2015.08.11 09:49:35]


WITH TA AS(
SELECT '1' FLAG , 1 COL1, 2 COL2, 3 COL3, 4 COL4, 5 COL5 FROM DUAL UNION ALL
SELECT '2' , 6, 7, 8, 9, 10 FROM DUAL UNION ALL
SELECT '3' , 11, 12, 13, 14, 15 FROM DUAL UNION ALL
SELECT '4' , 16, 17, 18, 19, 20 FROM DUAL
)
SELECT * FROM TA
 
--아래와 같이 원하는 결과값을 붙이고 싶습니다.
--첫번째 추가 로우는 FALG1 + FLAG3 의 COL 합계
--두번째 추가 로우는 FALG2 + FLAG4 의 COL 합계
UNION ALL
SELECT 'FLAG1+FLAG3' , 12, 14, 16, 18, 20 FROM DUAL
UNION ALL
SELECT 'FLAG2+FLAG4' , 22, 22, 26, 28, 30 FROM DUAL
;

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

질문을 수정합니다... 

WITH TA AS(
SELECT '1' FLAG , 1 COL1, 2 COL2, 3 COL3, 4 COL4, 5 COL5 FROM DUAL UNION ALL
SELECT '2' , 6, 7, 8, 9, 10 FROM DUAL UNION ALL
SELECT '3' , 11, 12, 13, 14, 15 FROM DUAL UNION ALL
SELECT '4' , 16, 17, 18, 19, 20 FROM DUAL UNION ALL
SELECT '5' , 21, 22, 23, 24, 25 FROM DUAL
)
SELECT * FROM TA
    
--아래와 같이 원하는 결과값을 붙이고 싶습니다.
--첫번째 추가 로우는 FLAG값이 1과 3의 COL 합계
--두번째 추가 로우는 FLAG값이 2와 3의 COL 합계
--FLAG는 1,2,3 외에 여러 로우가 나올수 있으며.. 계산은 무조건 1,2,3 으로만 계산이 됩니다.
UNION ALL
SELECT 'FLAG1+FLAG3' , 12, 14, 16, 18, 20 FROM DUAL
UNION ALL
SELECT 'FLAG2+FLAG3' , 17, 19, 21, 23, 25 FROM DUAL
;

 

by 창조의날개 [2015.08.11 09:59:18]


WITH TA AS(
SELECT '1' FLAG , 1 COL1, 2 COL2, 3 COL3, 4 COL4, 5 COL5 FROM DUAL UNION ALL
SELECT '2' , 6, 7, 8, 9, 10 FROM DUAL UNION ALL
SELECT '3' , 11, 12, 13, 14, 15 FROM DUAL UNION ALL
SELECT '4' , 16, 17, 18, 19, 20 FROM DUAL
)
SELECT 'FLAG'||LISTAGG(FLAG, '+FLAG') WITHIN GROUP(ORDER BY FLAG) FLAG
     , SUM(COL1) COL1
     , SUM(COL2) COL2
     , SUM(COL3) COL3
     , SUM(COL4) COL4
     , SUM(COL5) COL5
FROM TA
GROUP BY MOD(FLAG,2)
ORDER BY 1
;

by 쿼리를 정복하라 [2015.08.11 10:32:59]
WITH TA AS(
SELECT '1' FLAG , 1 COL1, 2 COL2, 3 COL3, 4 COL4, 5 COL5 FROM DUAL UNION ALL
SELECT '2' , 6, 7, 8, 9, 10 FROM DUAL UNION ALL
SELECT '3' , 11, 12, 13, 14, 15 FROM DUAL UNION ALL
SELECT '4' , 16, 17, 18, 19, 20 FROM DUAL UNION ALL
SELECT '5' , 21, 22, 23, 24, 25 FROM DUAL
)
SELECT * FROM TA
   
--아래와 같이 원하는 결과값을 붙이고 싶습니다.
--첫번째 추가 로우는 FLAG값이 1과 3의 COL 합계
--두번째 추가 로우는 FLAG값이 2와 3의 COL 합계
--FLAG는 1,2,3 외에 여러 로우가 나올수 있으며.. 계산은 무조건 1,2,3 으로만 계산이 됩니다.
UNION ALL
SELECT 'FLAG1+FLAG3' , 12, 14, 16, 18, 20 FROM DUAL
UNION ALL
SELECT 'FLAG2+FLAG3' , 17, 19, 21, 23, 25 FROM DUAL
;


빠른답변 감사합니다.
일단 제가 질문을 정확하게 하지 못한점 죄송합니다. 
제가 원했던거는 답변주신것처럼 그룹으로 묶인게 아니라.. 특정로우만을 가지고 계산목적이였습니다.

위와 같이 할려면 어떻게 해야할까요 ..


by 창조의날개 [2015.08.11 10:39:43]


WITH TA AS(
SELECT '1' FLAG , 1 COL1, 2 COL2, 3 COL3, 4 COL4, 5 COL5 FROM DUAL UNION ALL
SELECT '2' , 6, 7, 8, 9, 10 FROM DUAL UNION ALL
SELECT '3' , 11, 12, 13, 14, 15 FROM DUAL UNION ALL
SELECT '4' , 16, 17, 18, 19, 20 FROM DUAL UNION ALL
SELECT '5' , 6, 1, 118, 9, 201 FROM DUAL UNION ALL
SELECT '6' , 1, 1, 218, 149, 240 FROM DUAL
)
SELECT 'FLAG'||LISTAGG(FLAG, '+FLAG') WITHIN GROUP(ORDER BY FLAG) FLAG
     , SUM(COL1) COL1
     , SUM(COL2) COL2
     , SUM(COL3) COL3
     , SUM(COL4) COL4
     , SUM(COL5) COL5
FROM TA
WHERE FLAG IN (1,2,3,4)
GROUP BY DECODE(FLAG,1,1,2,2,3,1,4,2,0)
ORDER BY 1
;

by 쿼리를 정복하라 [2015.08.11 11:21:47]

추가답변 너무 감사합니다. 

제가 쓰는 오라클이 10g라서 실행은 안되지만 결과값 예상은 됩니다. 

결과값이 FLAG값이 1과3을 뭉치고 2와 4를 뭉쳐서 계산 시켜주는거 같은데요..

1과 3의 합계 , 2와 3의 합계 를 출력하고 싶습니다. 

더불어 응용해서 더하기를 나누기로 바꿔서.. FLAG3 / FLAG1  과   FALG3 / FLAG2 의 값을 뽑고 싶습니다.

처음에는 답변이 SUM 이 아닌  + 로  예상을 해서 나중에 제가 나누기로 변경할려고 했는데

그룹함수 SUM 으로 계산이 되니.. 제가 나누기로 변경하기가 너무 어렵네요 ㅠㅠ

그리고 GROUP BY DECODE 쓰는 방법을 알게되어 너무 감사합니다.


by 창조의날개 [2015.08.11 11:31:07]


WITH TA AS(
SELECT '1' FLAG , 1 COL1, 2 COL2, 3 COL3, 4 COL4, 5 COL5 FROM DUAL UNION ALL
SELECT '2' , 6, 7, 8, 9, 10 FROM DUAL UNION ALL
SELECT '3' , 11, 12, 13, 14, 15 FROM DUAL UNION ALL
SELECT '4' , 16, 17, 18, 19, 20 FROM DUAL UNION ALL
SELECT '5' , 6, 1, 118, 9, 201 FROM DUAL UNION ALL
SELECT '6' , 1, 1, 218, 149, 240 FROM DUAL
)
SELECT 'FLAG'||AA.FLAG||'+'||'FLAG'||BB.FLAG FLAG
     , AA.COL1 + BB.COL1 COL1_HAP
     , AA.COL2 + BB.COL2 COL2_HAP
     , AA.COL3 + BB.COL3 COL3_HAP
     , AA.COL4 + BB.COL4 COL4_HAP
     , AA.COL5 + BB.COL5 COL5_HAP
FROM TA AA, TA BB
WHERE AA.FLAG = 3
  AND BB.FLAG IN (1,2)
;

by 쿼리를 정복하라 [2015.08.11 11:48:21]

셀프조인을 이럴때 활용하는군요..

좋은 정보 빠른답변 감사합니다.

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