안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "즐겨찾기가 가장 많은 식당 정보 출력하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/131123)
1. 문제 : 즐겨찾기가 가장 많은 식당 정보 출력하기(Lv. 3)
2. 문제 설명
다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며
REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은
식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.
[ 테이블 구조('ONLINE_SALE') ]
COLUMN NAME | TYPE | NULLABLE |
ONLINE_SALE_ID | INTEGER | FALSE |
USER_ID | INTEGER | FALSE |
PRODUCT_ID | INTEGER | FALSE |
SALES_AMOUNT | INTEGER | FALSE |
SALES_DATE | DATE | FALSE |
동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.
OFFLINE_SALE 테이블은 아래와 같은 구조로 되어있며
OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는
각각 오프라인 상품 판매 ID, 상품 ID, 판매량, 판매일을 나타냅니다.
[ 테이블 구조('OFFLINE_SALE') ]
COLUMN NAME | TYPE | NULLABLE |
OFFLINE_SALE_ID | INTEGER | FALSE |
PRODUCT_ID | INTEGER | FALSE |
SALES_AMOUNT | INTEGER | FALSE |
SALES_DATE | DATE | FALSE |
동일한 날짜, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.
[ 문제 ]
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 | 2 | 2 | 2 | 2022-03-02 |
4 | 6 | 3 | 3 | 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 |
4 | 1 | 2 | 2022-03-01 |
3 | 3 | 3 | 2022-03-01 |
2 | 4 | 1 | 2022-03-01 |
5 | 2 | 1 | 2022-03-03 |
6 | 2 | 1 | 2022-04-01 |
각 테이블의 2022년 3월의 판매 데이터를 합쳐서, 정렬한 결과는 다음과 같아야 합니다.
[ 출력 결과 ]
SALES_DATE | PRODUCT_ID | USER_ID | SALES_AMOUNT |
2022-03-01 | 1 | NULL | 2 |
2022-03-01 | 3 | NULL | 3 |
2022-03-01 | 4 | NULL | 1 |
2022-03-01 | 4 | 4 | 1 |
2022-03-02 | 2 | 2 | 2 |
2022-03-02 | 3 | 6 | 3 |
2022-03-03 | 2 | NULL | 1 |
2022-03-03 | 5 | 5 | 1 |
3. 문제 풀이
# 1안
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
, PRODUCT_ID
, USER_ID
, SALES_AMOUNT
FROM ONLINE_SALE
WHERE 1=1
AND YEAR(SALES_DATE) = 2022
AND MONTH(SALES_DATE) = 3
UNION
ALL
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
, PRODUCT_ID
, NULL AS USER_ID
, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE 1=1
AND YEAR(SALES_DATE) = 2022
AND MONTH(SALES_DATE) = 3
ORDER
BY SALES_DATE
, PRODUCT_ID
, USER_ID
이번 문제는 총 1안 한 가지로 작성했습니다!
# 1안 풀이 설명
# [ 문제 접근 설명 ]
문제를 읽고 조건에 맞는 쿼리를 작성하기 위해서 다음과 같이 다섯 가지 단계로 진행했어요!
1. 필요한 컬럼 확인
2. ONLINE_SALE 테이블에서 2022년 3월 데이터 추출 및 컬럼 정리
3. OFFLINE_SALE 테이블에서 2022년 3월 데이터 추출 및 컬럼 정리
4. 2번과 3번 테이블에서 만들 결과 결합(UNION)
5. 판매일자, 상품ID, 유저ID 기준으로 정렬(ORDER BY)
# [ 1안 쿼리 작성 설명 ]
1 첫 번째 단계에서는 ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 가공 후 가져올 컬럼을 확인했습니다!
문제를 읽으면 판매 날짜(SALES_DATE), 상품 ID(PRODUCT_ID), 유저 ID(USER_ID), 그리고 판매량(SALES_AMOUNT)이 필요한 것을 알 수 있습니다.
DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
, PRODUCT_ID
, USER_ID
, SALES_AMOUNT
2 두 번째 단계에서는 ONLINE_SALE 테이블에서 데이터를 가공했습니다.
2022년 3월 데이터 추출하고 1번에서 확인한 컬럼에 맞게 정리해 주었어요!
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
, PRODUCT_ID
, USER_ID
, SALES_AMOUNT
FROM ONLINE_SALE
WHERE 1=1
AND YEAR(SALES_DATE) = 2022
AND MONTH(SALES_DATE) = 3
3 세 번째 단계에서는 OFFLINE_SALE 테이블에서 데이터를 가공했습니다.
두 번째 단계에서 진행한 것과 마찬가지로
2022년 3월 데이터 추출하고 1번에서 확인한 컬럼에 맞게 정리해주었어요!
OFFLINE 테이블은 USER_ID가 없어서 USER_ID을 NULL값으로 표시했습니다.
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
, PRODUCT_ID
, NULL AS USER_ID
, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE 1=1
AND YEAR(SALES_DATE) = 2022
AND MONTH(SALES_DATE) = 3
4 네 번째 단계에서는 두 번째 단계와 세 번째 단계에서 생성한 결과물을 합쳐주는 작업을 했습니다.
UNION ALL을 이용해서 두 결과를 위아래로 결합해 주었습니다.
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
, PRODUCT_ID
, USER_ID
, SALES_AMOUNT
FROM ONLINE_SALE
WHERE 1=1
AND YEAR(SALES_DATE) = 2022
AND MONTH(SALES_DATE) = 3
UNION
ALL
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
, PRODUCT_ID
, NULL AS USER_ID
, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE 1=1
AND YEAR(SALES_DATE) = 2022
AND MONTH(SALES_DATE) = 3
5 마지막으로는 요구사항에 맞게 정렬했어요!
판매일자(SALES_DATE) 기준 오름차순 정렬,
상품ID(PRODUCT_ID) 기준 오름차순 정렬.
그리고 유저(USER_ID) 기준 오름차순으로 정렬했습니다!
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
, PRODUCT_ID
, USER_ID
, SALES_AMOUNT
FROM ONLINE_SALE
WHERE 1=1
AND YEAR(SALES_DATE) = 2022
AND MONTH(SALES_DATE) = 3
UNION
ALL
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE
, PRODUCT_ID
, NULL AS USER_ID
, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE 1=1
AND YEAR(SALES_DATE) = 2022
AND MONTH(SALES_DATE) = 3
ORDER
BY SALES_DATE
, PRODUCT_ID
, USER_ID
4. 데코의 문제 풀이 후기
이번 문제도 LEVEL 4인 문제임에도
두 테이블에서 원하는 데이터를 추출하고 합치는 작업을 어렵지 않게 했습니다!
제가 다룬 문제에서는 처음으로 UNION ALL을 이용했네요!
개인적으로 선호하지 않지만, 이렇게 쓰임이 필요하면 써야 하니까 알아두는 것도 좋을 것 같습니다.
이 외에는 이전 문제들에서 모두 다룬 것들을 이용해서
따로 코멘트할 것은 없네요!
혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요!
이번 문제는 2개의 테이블에서 원하는 데이터를 추출하고 결합하는 쿼리를 작성해 보았습니다!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 그룹별 조건에 맞는 식당 목록 출력하기(프로그래머스/MySQL/Level 4) (76) | 2024.01.19 |
---|---|
[SQL] 상품을 구매한 회원 비율 구하기(프로그래머스/MySQL/Level 5) (81) | 2023.12.01 |
[SQL] 오프라인/온라인 판매 데이터 통합하기(프로그래머스/MySQL/Level 4) (69) | 2023.11.11 |
[SQL] 년, 월, 성별 별 상품 구매 회원 수 구하기(프로그래머스/MySQL/Level 4) (56) | 2023.11.04 |
[SQL] SQL 쿼리 양식 및 작성 규칙 (66) | 2023.10.21 |