👇 오프라인/온라인 판매 데이터 통합하기
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
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 |
| 3 | 6 | 3 | 3 | 2022-03-02 |
| 4 | 2 | 2 | 2 | 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 |
| 2 | 4 | 1 | 2022-03-01 |
| 3 | 3 | 3 | 2022-03-01 |
| 4 | 1 | 2 | 2022-03-01 |
| 5 | 2 | 1 | 2022-03-03 |
| 6 | 2 | 1 | 2022-04-01 |
⚡SQL Query
SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE,
PRODUCT_ID,
USER_ID,
SALES_AMOUNT
FROM (
-- 온라인 판매 데이터
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE BETWEEN TO_DATE('2022-03-01', 'YYYY-MM-DD')
AND TO_DATE('2022-03-31', 'YYYY-MM-DD')
UNION ALL
-- 오프라인 판매 데이터 (USER_ID는 NULL로 처리)
SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE BETWEEN TO_DATE('2022-03-01', 'YYYY-MM-DD')
AND TO_DATE('2022-03-31', 'YYYY-MM-DD')
)
ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC;
🔎 풀이 설명
1. UNION ALL: 중복 데이터도 포함하여 두 테이블을 결합합니다.
2. 컬럼 맞추기: 오프라인 테이블에 USER_ID가 없으므로 집합 연산을 위해 NULL AS USER_ID를 통해서 컬럼의 개수를 일치시켰습니다.
💡인사이트
1. UNION vs UNION ALL
- 두 집합의 중복 데이터까지 출력이 필요한 경우 UNION ALL을 사용하고, 제거가 필요한 경우 UNION을 사용해야하며 UNION을 사용하게 되면 Sort Unique 연산이 발생하여 I/O와 CPU를 사용합니다.
2. 정렬 부하
- 위 문제에서는 세 가지 컬럼이 ORDER BY절에 있기 때문에 데이터 양이 많을 경우 Temp Tablespace를 사용할 수 있고, 대용량 환경에서는 정렬을 피할 수 있는 인덱스 구성이나 Parallel 처리를 고민 해야합니다.
'🗄️ DB_이야기 > # ⚡SQL' 카테고리의 다른 글
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 업그레이드 된 아이템 구하기(SELECT) (0) | 2026.04.15 |
|---|---|
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 상위 n개 레코드(SELECT) (0) | 2026.04.15 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 재구매가 일어난 상품과 회원 리스트 구하기(SELECT) (0) | 2026.04.14 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 서울에 위치한 식당 목록 출력하기(SELECT) (0) | 2026.04.13 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 강원도에 위치한 생산공장 목록 출력하기(SELECT) (0) | 2026.04.13 |