WITH T AS ( SELECT A ' AS gubun1, 20 AS AMT1, " AS gubun2, O AS AMT2 FROM DUAL UNION ALL SELECT " AS gubun1, O AS AMT1, 'C' AS gubun2, 40 AS AMT2 FROM DUAL UNION ALL SELECT B ' AS gubun1, 30 AS AMT1, " AS gubun3, 0 AS AMT2 FROM DUAL ) SELECT gubun1, AMT1, gubun2, AMT2 FROM T
회사 업무중에 계속 고민중인데 아직 해결을 못해서요...ㅠ
아래 <로우데이터>는 이마 1차례 GROUP BY로 데이터 가공한 결과고 그 결과를 <최종결과>처럼 데이터를 전달하려고 하는데요. 추가적으로 쿼리좀 봐주시겠어요?!
<로우데이터>
| GUBUN1 | AMT1 | GUBUN2 | AMT2 |
| A | 20 | 0 | |
| A | 30 | 0 | |
| 0 | C | 40 | |
| B | 40 | 0 |
<최종결과>
| GUBUN1 | AMT1 | GUBUN2 | AMT2 |
| A | 50 | C | 40 |
| B | 40 |
올.... 챗gpt 요놈...은 GUBUN1, GUBUN2 영역을 나워서 ROW_NUMBER()로 채번을 만들고 그 채번으로 FULL OUTER JOIN()을 하라고 했네요...ㅋ 똑똑하네 요놈...^^ 고수님들 생각좀 듣고 싶어요~~~~인간은 AI다 우월하다...!!!!ㅋ
WITH t AS
(
SELECT 'A' gubun1, 20 amt1, '' gubun2, 0 amt2 FROM dual
UNION ALL SELECT 'A', 30, '' , 0 FROM dual
UNION ALL SELECT '' , 0, 'C', 40 FROM dual
UNION ALL SELECT 'B', 40, '' , 0 FROM dual
)
SELECT MIN(gubun1) gubun1
, SUM(amt1) amt1
, MIN(gubun2) gubun2
, SUM(amt2) amt2
FROM (SELECT gubun1, amt1, gubun2, amt2
, DENSE_RANK() OVER(PARTITION BY NVL2(gubun1, 1, 2) ORDER BY gubun1, gubun2) dr
FROM t
)
GROUP BY dr
ORDER BY dr
;
답변 주셔서 감사합니다.
WITH T_origin AS ( SELECT '1 AS grop, 'A' AS gubun, 20 AS AMT FROM DUAL UNION ALL SELECT '1 AS grop, 'A' AS gubun, 30 AS AMT FROM DUAL UNION ALL SELECT '2' AS grop, 'B' AS gubun, 40 AS AMT FROM DUAL UNION ALL SELECT '1 AS grop, 'C' AS gubun, 40 AS AMT FROM DUAL ) SELECT FROM T_origin
마농님 답변 너무 감사합니다.
말씀하신 중간 데이터 전 원 데이터는 저렇고 아래와 같이 grop필드별로 gubun1, gubun2로 나눠서 합산을 해달라는 요청이거든요.
| GUBUN1 | AMT1 | GUBUN2 | AMT2 |
| A | 50 | C | 40 |
| B | 40 |
WITH T_origin AS
(
SELECT 1 grop, 'A' gubun, 20 amt FROM dual
UNION ALL SELECT 1, 'A', 30 FROM dual
UNION ALL SELECT 1, 'B', 40 FROM dual
UNION ALL SELECT 2, 'C', 40 FROM dual
)
SELECT *
FROM (SELECT grop, gubun
, SUM(amt) amt
, ROW_NUMBER() OVER(PARTITION BY grop ORDER BY gubun) rn
FROM T_origin
GROUP BY grop, gubun
)
PIVOT (MIN(gubun) gubun, MIN(amt) amt FOR grop IN (1, 2))
ORDER BY rn
;
WITH T_origin AS
(
SELECT 1 grop, 'A' gubun, 20 amt FROM dual
UNION ALL SELECT 1, 'A', 30 FROM dual
UNION ALL SELECT 1, 'B', 40 FROM dual
UNION ALL SELECT 2, 'C', 40 FROM dual
)
SELECT rn
, MIN(DECODE(grop, 1, gubun)) gubun_1
, MIN(DECODE(grop, 1, amt )) amt_1
, MIN(DECODE(grop, 2, gubun)) gubun_2
, MIN(DECODE(grop, 2, amt )) amt_2
FROM (SELECT grop, gubun
, SUM(amt) amt
, ROW_NUMBER() OVER(PARTITION BY grop ORDER BY gubun) rn
FROM T_origin
GROUP BY grop, gubun
)
GROUP BY rn
ORDER BY rn
;
, ROW_NUMBER() OVER(PARTITION BY grop ORDER BY gubun) rn
-> Group by 할 새로운 키를 만들고 정렬한다... 정말 왜 이생각을 못한건지 너무 부족한게 많네요.
감사합니다.
, ROW_NUMBER() OVER(PARTITION BY grop ORDER BY gubun) rn
-> Group by 할 새로운 키를 만들고 정렬한다... 정말 왜 이생각을 못한건지 너무 부족한게 많네요.
감사합니다.