DB/MySQL

[MySQL] UNION을 사용해서 SUM 구하기

동호다찌 2022. 4. 18. 18:43

UNION이란 무엇인가?

UNION은 두 개 이상의 쿼리를 합쳐 하나의 쿼리로 만들어 주는 역할을 한다. 이 때 각 컬럼명은 같아야하며 데이터타입 역시 동일해야한다. 만일 컬럼명이 다른 경우엔 AS 를 사용해 컬럼명을 통일시켜주어야 한다.

UNION VS UNION ALL

우선 기본적으로 UNION은 UNIONDistinct를 줄여서 쓰는 개념이다. 즉, 중복을 허락하지 않는다.
예를 들어 EX_TABLE1 에서 select 한 값이 'test1', 'test2' 이고
EX_TABLE2에서 select 한 값이 'test1', 'test3'이라고 가정해보자.

이때 UNION을 써서 두 sql을 합쳐주면 결과는 'test1', 'test2', 'test3'으로
중복을 제거한 결과값을 돌려준다.

하지만 Union all을 사용해 두 sql을 합친다면 결과는
'test1', 'test2', 'test1', 'test3' 가 될 것이다.

UNION의 경우 중복을 제거하는 작업을 시행해주기 때문에 UNION ALL 에 비해 처리 속도가 느리다.
그렇기 때문에 중복되어도 크게 이상이 없는 경우에는 되도록 UNION ALL 을 사용해주는 것이 좋다.

쿼리(QUERY)문을 이용하여 각각 COUNT or SUM을 출력하여 code상에서 합(sum)을 할 수도 있으나,

UNION ALL을 사용하여 COUNT 값만 가지와서 SUM을 할 수 있다. 

이때 아래와 같이 사용함으로 결과값에 대한 SUM을 하여 사용 할 수 있다. 

-- 테스트1 테이블
SELECT COUNT(*) 
  FROM test1 -- 결과: 5

-- 테스트2 테이블
SELECT COUNT(*)
  FROM test2 -- 결과: 3
  
-- UNION ALL 사용해서 합치기
SELECT COUNT(a.cnt)
  FROM ( (SELECT COUNT(*) AS cnt
            FROM test1)
           UNION ALL
         (SELECT COUNT(*) AS cnt
            FROM test2)
       )AS a;
       
 --> 결과는 8로 나온다.

 

-- 테스트1 테이블
SELECT money_id, SUM(money)
  FROM test1
 GROUP BY money_id
  -- 결과: 50,000

-- 테스트2 테이블
SELECT money_id, SUM(money)
  FROM test1
 GROUP BY money_id
  -- 결과: 100,000
  
-- UNION ALL 사용해서 합치기
SELECT SUM(a.mney)
  FROM ( (SELECT money_id, SUM(money) AS mney
  			FROM test1
		   GROUP BY money_id)
           UNION ALL
         (SELECT money_id, SUM(money) AS mney
  			FROM test1
		   GROUP BY money_id)
       ) AS a;
       
 --> 결과는 150,000로 나온다.