🤔 문제
다음은 어느 의류 쇼핑몰의 온라인 상품판매 정보를 담은 `ONLINE_SALE` 테이블과 오프라인 상품 판매 정보를 담은 `OFFLINE_SALE` 테이블 입니다. `ONLINE_SALE` 테이블은 아래와 같은 구조로 되어있으며 `ONLINE_SALE_ID`, `USER_ID`, `PRODUCT_ID`, `SALES_AMOUNT`, `SALES_DATE`는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.
동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.
`OFFLINE_SALE` 테이블은 아래와 같은 구조로 되어있으며 `OFFLINE_SALE_ID`, `PRODUCT_ID`, `SALES_AMOUNT`, `SALES_DATE`는 각각 오프라인 상품 판매 ID, 상품 ID, 판매량, 판매일을 나타냅니다.
동일한 날짜, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.
`ONLINE_SALE` 테이블과 `OFFLINE_SALE` 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품 ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. `OFFLINE_SALE` 테이블의 판매 데이터의 `USER_ID` 값은 `NULL`로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저ID를 기준으로 오름차순 정렬해주세요.
예시
예를 들어 `ONLINE_SALE` 테이블이 다음과 같고
`OFFLINE_SALE` 테이블이 다음과 같다면
각 테이블의 2022년 3월의 판매 데이터를 합쳐서 정렬한 결과는 다음과 같아야 합니다.
💻 나의 풀이(오답)
SELECT * -- 전체 조회
FROM( -- 서브쿼리 생성(전체 정렬을 위해서)
SELECT DATE_FORMAT(ons.SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
ons.PRODUCT_ID,
ons.USER_ID AS USER_ID,
ons.SALES_AMOUNT
FROM ONLINE_SALE ons
WHERE DATE_FORMAT(ons.SALES_DATE, '%Y-%m') = '2022-03'
UNION
SELECT DATE_FORMAT(ofs.SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
ofs.PRODUCT_ID,
'NULL' AS USER_ID, -- 없는 컬럼은 NULL로 채우기
ofs.SALES_AMOUNT
FROM OFFLINE_SALE ofs
WHERE DATE_FORMAT(ofs.SALES_DATE, '%Y-%m') = '2022-03'
) AS result
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID; -- 병합한 데이터 전체 정렬
결과
🖍 다시 풀기
SELECT * -- 전체 조회
FROM( -- 서브쿼리 생성(전체 정렬을 위해서)
SELECT DATE_FORMAT(ons.SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
ons.PRODUCT_ID,
ons.USER_ID AS USER_ID,
ons.SALES_AMOUNT
FROM ONLINE_SALE ons
WHERE DATE_FORMAT(ons.SALES_DATE, '%Y-%m') = '2022-03'
UNION
SELECT DATE_FORMAT(ofs.SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
ofs.PRODUCT_ID,
NULL AS USER_ID, -- 없는 컬럼은 NULL로 채우기
ofs.SALES_AMOUNT
FROM OFFLINE_SALE ofs
WHERE DATE_FORMAT(ofs.SALES_DATE, '%Y-%m') = '2022-03'
) AS result
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID; -- 병합한 데이터 전체 정렬
다시 푼 결과
틀린 이유
문제에서 "`OFFLINE_SALE` 테이블의 판매 데이터의 `USER_ID` 값은 NULL로 표기"라고 되어있어서,
처음에 `'NULL' AS UER_ID`라고 썼더니 틀렸다. (문자열 `'NULL'`인 줄 알았음)
따옴표 없이 그냥 `NULL AS USER_ID`라고 써야 한다.
💡 다른 풀이
1. 서브 쿼리 대신 괄호 ( )로 묶는 방법
(SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE,
PRODUCT_ID,
USER_ID,
SALES_AMOUNT
FROM ONLINE_SALE AS N
WHERE SALES_DATE LIKE '2022-03%'
UNION
SELECT DATE_FORMAT(SALES_DATE, "%Y-%m-%d") AS SALES_DATE,
PRODUCT_ID,
NULL AS USER_ID,
SALES_AMOUNT
FROM OFFLINE_SALE AS F
WHERE SALES_DATE LIKE '2022-03%')
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID
서브쿼리 대신 괄호만으로 묶어도 되는 줄 몰랐는데, 이 방법이 코드도 훨씬 깔끔해보이고 좋다.
그리고 `UNION`의 경우 일일이 컬럼마다 `별칭.컬럼명` 이런식으로 안해도 되는 것 같다.
🔗 References
[UNION시 존재하지 않는 컬럼값 대체하기]
[UNION 병합 결과 ORDER BY로 정렬하기]
https://luvris2.tistory.com/799
[다른 풀이 1]
🧘🏻♀️ 느낀 점
다른 분들 풀이 보니까 비슷한 이유로 틀린 케이스가 많았다.
사실 따옴표 유무로 틀리는 것은 정말 사소한 문제인데 원인을 못찾아서 한참 시간을 잡아먹었던 것 같아서 틀린 이유를 알고서도 기분이 영.. 좋지 않다. 이건 본인이 좀 더 꼼꼼히 살피는 수밖에 없을 것 같다.
'취업준비 > 코딩테스트 문제 풀이' 카테고리의 다른 글
[프로그래머스 SQL 코딩테스트 연습] Lv3. 조건에 맞는 사용자와 총 거래금액 조회하기 (MySQL) (0) | 2024.03.30 |
---|---|
[프로그래머스 SQL 코딩테스트 연습] GROUP BY - 부서별 평균 연봉 조회하기 (0) | 2024.03.30 |
[프로그래머스 SQL 고득점 Kit] SELECT - 재구매가 일어난 상품과 회원 리스트 구하기 (1) | 2024.03.29 |
[프로그래머스 SQL 고득점 Kit] SELECT - 서울에 위치한 식당 목록 출력하기 (0) | 2024.03.29 |
[프로그래머스 SQL 고득점 Kit] SELECT - 강원도에 위치한 생산공장 목록 출력하기 (0) | 2024.03.29 |