[프로그래머스]즐겨찾기가 가장 많은 식당 정보 출력하기 - SQL

Donghyun·2024년 7월 7일
0

Code Kata - SQL

목록 보기
6/61
post-thumbnail

링크: https://school.programmers.co.kr/learn/courses/30/lessons/131123

문제 설명

다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_IDREST_NAMEFOOD_TYPEVIEWSFAVORITESPARKING_LOTADDRESSTEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.

Column nameTypeNullable
REST_IDVARCHAR(5)FALSE
REST_NAMEVARCHAR(50)FALSE
FOOD_TYPEVARCHAR(20)TRUE
VIEWSNUMBERTRUE
FAVORITESNUMBERTRUE
PARKING_LOTVARCHAR(1)TRUE
ADDRESSVARCHAR(100)TRUE
TELVARCHAR(100)TRUE

문제

REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.


예시

REST_INFO 테이블이 다음과 같을 때

REST_IDREST_NAMEFOOD_TYPEVIEWSFAVORITESPARKING_LOTADDRESSTEL
00001은돼지식당한식1150345734N서울특별시 중구 다산로 149010-4484-8751
00002하이가쯔네일식120034112N서울시 중구 신당동 375-21NULL
00003따띠따띠뜨양식1234023102N서울시 강남구 신사동 627-3 1F02-6397-1023
00004스시사카우스일식1522074230N서울시 서울시 강남구 신사동 627-27010-9394-2554
00005코슌스일식15301123N서울특별시 강남구 언주로153길010-1315-8729

SQL을 실행하면 다음과 같이 출력되어야 합니다.

FOOD_TYPEREST_IDREST_NAMEFAVORITES
한식00001은돼지식당734
일식00004스시사카우스230
양식00003따띠따띠뜨102

문제풀이

  1. 음식종류별 → GROUP BY(FOOD_TYPE)
  2. 즐겨찾기 수가 가장 많은 식당 → MAX(FAVORITES)
  3. 음식종류, ID, 식당이름, 즐겨찾기수 → FOOD_TYPE, REST_ID, REST_NAME, FAVOITES
  4. 음식 종류를 기준으로 내림차순 → ORDER BY FOOD_TYPE DESC;

전체 구문으로 합치기

SELECT
    FOOD_TYPE,
    REST_ID,
    REST_NAME,
    MAX(FAVORITES) FAVORITES
FROM REST_INFO
GROUP BY 1
ORDER BY 1 DESC;

에러도 안 나고 조건에 맞게 쿼리문 잘 짠 거 같은데 왜 오답이지?? 뭐가 문제일까?

  • 검색해보니 GROUP BY 로 묶으면 가장 상단에 있는 데이터들을 임의로 가져온다고 한다.
  • 그래서 전체 데이터와 GROUP BY 로 그룹별로 묶어 MAX(FAVORITES) 을 했을때의 결과를 비교해보니 다른 데이터들의 값들은 운이 좋게도 MAX 결과들을 가져왔지만 일식의 데이터는 원래대로라면 230의 즐겨찾기를 갖고 있는 ‘스시사카우스’ 가 조회되어야 하지만 엉뚱하게도 하이가쯔네가 조회되고, FAVORITES 도 잘못된 것을 확인할 수 있었다.
  • 그래서 이걸 해결하려면 WHERE 절에서 서브쿼리문을 사용해 FOOD_TYPE 별로 가장 FAVORITES 가 높은 값과 SELECT 절에서 조회하려는 FAVORITES 가 일치하도록 쿼리문을 만들어서 해결해줘야한다.

최종코드

SELECT
    FOOD_TYPE,
    REST_ID,
    REST_NAME,
    FAVORITES
FROM REST_INFO
WHERE FAVORITES
IN
(
SELECT MAX(FAVORITES) FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
) 
GROUP BY 1
ORDER BY 1 DESC;
profile
데이터분석 공부 일기~!

0개의 댓글