1. 문제
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인데 문자열이 들어갈 수 없음ㅎㅎ^^
'코딩테스트 > SQL' 카테고리의 다른 글
[SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 - MySQL (0) | 2023.04.16 |
---|---|
[SQL] 취소되지 않은 진료예약 조회하기 - MySQL (0) | 2023.02.27 |
[SQL] DATETIME에서 DATE로 형 변환 - MYSQL (0) | 2022.05.06 |
[SQL] 오랜 기간 보호한 동물(2) - MYSQL (0) | 2022.05.06 |
[SQL] 중성화 여부 파악하기 - MYSQL (0) | 2022.05.05 |
댓글