코딩테스트/SQL

[SQL] 오프라인/온라인 판매 데이터 통합하기 - MySQL

5월._. 2022. 10. 14.
728x90

1. 문제

 

프로그래머스

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

programmers.co.kr

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


2. 풀이

포맷팅한 sales_date, product_id, user_id, sales_amount를 online_sale과 offline_sale에서 select한 후 둘을 합친다.

이 때, offline_sale은 user_id가 없으므로 null값을 지정한다.

합한 테이블을 2022년 03월만 조회하고, 문제에 주어진 대로 정렬한다.

where 구문을 서브쿼리 안에 넣어도 되는데 밖으로 뺀 이유는 증복코드를 줄이기 위해서다. 

속도는 서브쿼리 안에 넣어서 각각 조건맞춰 select한 후 합하는 게 빠를 것 같기도 하다. 이건 나중에 테스트해봐야겠다!

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

3. 결과

OFFLINE_SALE테이블 USER_ID값을 NULL로 하는 것 때문에 엄청나게 틀렸다.

아래 그림처럼 예시 테이블에 NULL이라고 써져있길래 문자열인 줄 알았더니 정말 NULL이었던 것이다.. 

다시 생각해보니 내가 잘못했다.. USER_ID 타입이 INTEGER인데 문자열이 들어갈 수 없음ㅎㅎ^^

댓글