본문 바로가기

코딩테스트/SQL - 프로그래머스

SQL 고득점 kit(SELECT) - 오프라인/온라인 판매 데이터 통합하기

# 풀이
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
    FROM ONLINE_SALE
    WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31' 
UNION ALL
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
    FROM OFFLINE_SALE
    WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31'
    ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

 

- 해설

 3월에 팔린 상품 내역을 추출하고, 오프라인에서 팔린 상품의 USER_ID는 NULL로 표시하게 하는 문제.

 어렵거나 헷갈릴 것이 있는 문제는 아니었으므로, 한 줄 한 줄 해석하지는 않는다. 딱 봐도 2개의 테이블에서 추출한 데이터를 위아래로 합치면 될 것 같아 보인다.

 중복도 포함해야 하니 UNION ALL을 사용하고, OFFLINE_SALE엔 없는 USER_ID는 NULL로 표시해 준다.

그 외에는 문제에서 제시한 대로 조건을 달아주면 된다.

 

 

* 주의점

처음에는 예시는 안 보고 문제만 보고 다음과 같이 쿼리문을 제출했는데 자꾸 오답이 나기에 이유를 알 수가 없었다.

SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
    FROM ONLINE_SALE
    WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31' 
UNION ALL
SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
    FROM OFFLINE_SALE
    WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31'
    ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

 

몇 번이나 뜯어봐도 잘못 작성한 곳이 없어서 대체 뭐지 싶던 찰나, 예시를 봤고 이내 문제점을 알았다.

내가 작성한 쿼리문은 DATE_FORAT을 써 주지 않아 시분초 단위까지 전부 출력되는 쿼리인데, 예시에는 연월일만 나오게 되어 있었다.

설마 싶은 마음에 DATE_FORMAT을 추가했더니 바로 정답..

 

정답과 오답을 가를 정도라면 단순히 예시가 아니라 문제의 조건에 넣어놨어야 하는 것이 아닌가...? 싶다