쿼리 결과 합치기, 정렬 방법 2 221

by Kasap671 [SQL Query] 쿼리 결과 합치기 정렬 방법 [2025.04.28 10:24:58]


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    
by Kasap671 [2025.04.28 10:43:34]

올.... 챗gpt 요놈...은 GUBUN1, GUBUN2 영역을 나워서 ROW_NUMBER()로 채번을 만들고 그 채번으로 FULL OUTER JOIN()을 하라고 했네요...ㅋ 똑똑하네 요놈...^^ 고수님들 생각좀 듣고 싶어요~~~~인간은 AI다 우월하다...!!!!ㅋ 


by 마농 [2025.04.29 00:32:58]

중간결과를 다시 가공하여 최종결과를 만들어 낼 수도 있겠지만.
원본으로부터 최종결과를 추출하는 방법 중에 최선의 방법을 선택했을 때
해당 중간결과가 반드시 필요하다는 보장은 없습니다.
중간 결과가 아닌 원본 집합을 보여주세요.
원본 대비 결과표.


by 마농 [2025.04.29 08:32:29]
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
;

 


by Kasap671 [2025.04.29 11:03:39]

답변 주셔서 감사합니다.


by Kasap671 [2025.04.29 10:49:13]
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    

 


by 마농 [2025.04.29 11:13:17]
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
;

 


by Kasap671 [2025.04.29 13:43:45]

, ROW_NUMBER() OVER(PARTITION BY grop ORDER BY gubun) rn
 -> Group by 할 새로운 키를 만들고 정렬한다... 정말 왜 이생각을 못한건지 너무 부족한게 많네요.

감사합니다. 


by Kasap671 [2025.04.29 13:42:52]

, ROW_NUMBER() OVER(PARTITION BY grop ORDER BY gubun) rn
 -> Group by 할 새로운 키를 만들고 정렬한다... 정말 왜 이생각을 못한건지 너무 부족한게 많네요.

감사합니다.