본문 바로가기
🗄️ DB_이야기/# ⚡SQL

🚀[SQL 알고리즘 문제 풀이] Programmers : 오프라인/온라인 판매 데이터 통합하기(SELECT)

by gwon_s 2026. 4. 14.

👇 오프라인/온라인 판매 데이터 통합하기

 

프로그래머스

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 처리를 고민 해야합니다.