본문 바로가기

Skill Sets/SQL

[SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기(프로그래머스/MySQL/Level 3)

SMALL

안녕하세요! 데코입니다!

 

오늘은 프로그래머스 코딩테스트 연습에 있는 "즐겨찾기가 가장 많은 식당 정보 출력하기" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

(출처 : 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개의 테이블에서 원하는 데이터를 추출하고 결합하는 쿼리를 작성해 보았습니다!

설명이 어려운 부분 혹은 잘 이해가 안 가는 부분

그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!

빠르게 궁금증을 해결해 드릴게요!

공감과 댓글은 큰 힘이 됩니다!

오늘도 블로그 방문해 주시고

포스팅 읽어주셔서 감사합니다!

 

 

 

LIST