SQL

UNION 응용

zzugest1 2023. 1. 7. 23:06

https://school.programmers.co.kr/learn/courses/30/lessons/131537

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.


예시

 

예를 들어 ONLINE_SALE 테이블이 다음과 같고

ONLINE_SALE_ID USER_ID PRODUCT_ID SALES_AMOUNT SALES_DATE
1 1 3 2 2022-02-25
2 4 4 1 2022-03-01
4 2 2 2 2022-03-02
3 6 3 3 2022-03-02
5 5 5 1 2022-03-03
6 5 7 1 2022-04-06

OFFLINE_SALE 테이블이 다음과 같다면

OFFLINE_SALE_ID PRODUCT_ID SALES_AMOUNT SALES_DATE
1 1 2 2022-02-21
4 1 2 2022-03-01
3 3 3 2022-03-01
2 4 1 2022-03-01
5 2 1 2022-03-03
6 2 1 2022-04-01

각 테이블의 2022년 3월의 판매 데이터를 합쳐서, 정렬한 결과는 다음과 같아야 합니다.

SALES_DATE PRODUCT_ID USER_ID SALES_AMOUNT
2022-03-01 1 NULL 2
2022-03-01 3 NULL 3
2022-03-01 4 NULL 1
2022-03-01 4 4 1
2022-03-02 2 2 2
2022-03-02 3 6 3
2022-03-03 2 NULL 1
2022-03-03 5 5 1

 

 

정답

SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE, PRODUCT_ID,USER_ID,SALES_AMOUNT  FROM ONLINE_SALE
WHERE SALES_DATE LIKE '%2022-03%'
UNION ALL
SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT  FROM OFFLINE_SALE
WHERE SALES_DATE LIKE '%2022-03%'
ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC;

 

이 문제는 22년 3월 온/오프라인 판매 합계를 구하는 문제이다. 주어진 테이블은 온/오프라인 따로 주어져 있는상황이다. 

결과 테이블의 2022-03-01인 행을 보면 PRODUCT_ID가 4인 행이 두개이다. 각각 온/오프라인 테0이블에서 온 것인데 이는 중복된 PRODDUCT_ID가 있어도 합치지 않고 그대로 쓰여지는 것을 알 수 있다. 이롤 통해 필자는 두 테이블을 그대로 합치는 방법을 생각해 냈다. 

 

UNION : 두개 이상의 테이블을 합치는 연산자이다.

 

예시

 

테이블 A 

ID AGE
1 25
2 23

테이블 B

ID AGE
2 23
3 30

두 테이블이 주어졌다고 가정했을 때, 아래와 같이 UNION을 사용하면 

SELECT ID, AGE FROM A
UNION
SELECT ID, AGE FROM B

결과는 아래와 같이 나온다.

ID AGE
1 25
2 23
3 30

이때 중복되는 행은 하나의 행에만 출력된다. 중복행이 합쳐지지 않게 나오기 위한 방법으로 UNION ALL이 있다.

SELECT ID, AGE FROM A
UNION ALL
SELECT ID, AGE FROM B
ID AGE
1 25
2 23
2 23
3 30

위와 같이 UNION ALL은 중복행 상관없이 두 테이블을 그대로 합치는 방법이다. 

 

 

다시 정답코드로 돌아가면, ONLINE_SALE테이블에서 22년 3월의 상품 판매량만을 추출한 테이블과 OFFLINE_SALE테이블에서 22년 3월의 상품 판매량만을 추출한 테이블을 UNION으로 합친것을 볼 수 있다. 

ORDER BY절은 UNION으로 합쳐진 테이블에 자동으로 적용되는것을 볼 수 있다.

 

'SQL' 카테고리의 다른 글

정규표현식 REGEXP  (0) 2023.01.09
상품을 구매한 회원 비율 구하기  (0) 2023.01.09
서브쿼리 응용(3)  (1) 2023.01.06
3개 이상의 테이블 JOIN  (0) 2023.01.05
년, 월, 성별 별로 상품을 구매한 회원수 구하기 문제  (0) 2023.01.04