ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL] 식품분류별 가장 비싼 식품의 정보 조회하기
    내일배움캠프/SQL 2024. 6. 27. 21:37

    문제 설명

     

     

    내일배움캠프에서는 매일매일 코드카타 문제를 풉니다.

    거침없이 풀다가 이번 문제에서 막혀서 눈물이 좀 났습니다...

    제가 시도했던 방법들이 왜 먹히지 않았는지

    그리고 앞으로 이런 문제를 만났을 때

    어떻게 대처해야하는지 분석을 해보려고 합니다.

     


     

    오답 1. Group by와 Having을 사용

     

    SELECT food_type, rest_id, rest_name, favorite
    FROM rest_info
    GROUP BY food_type
    HAVING MAX(favorites)

     

    이 코드를 실행시켜본 결과는...

     

    오답1

     

    먼저 rest_info에서 음식 타입별로 그룹을 잘 나누어 주었습니다.

    그리고 HAVING으로 그룹에 대한 조건 MAX(favorites)을 줬습니다.

    그런데 이상하게도 일식의 경우만 max(favorites)에 해당하는 음식점이 나오지 않았습니다...

     

    where 조건에 각 음식 타입별로 검색하여 확인해보니

    공교롭게도 맨 위에 있는 음식점이 출력되었습니다.

    그리고 하필 맨 위에 있는 음식점들이 일식 음식점을 제외하고

    favorites가 제일 높은 음식점들이었습니다..

    그래서 너무 헷갈렸습니다..

     

     

    즉, having절이 제대로 먹히지 않았다는 것입니다..

     

    왜 그런지 알아보니 having절은

    HAVING MAX(favorites) > some_value과 같이

    집계함수 외에도 추가로 조건을 줘야한다고 합니다.

     

    올바른 having절의 사용 방법을 몰랐다는 게 문제였던 것입니다...

     

     

     

    오답 2.  서브 쿼리

     

    SELECT a.food_type, b.rest_id, b.rest_name, b.favorites
    FROM (SELECT food_type, MAX(favorites) mf
                 FROM rest_info
                 GROUP BY food_type
    ) a JOIN rest_info b ON a.mf = b.favorites

     

     

    이번에는 서브 쿼리로 rest_info의 MAX(favorites)의 값을 가져와서

    본 테이블과 조인하여

    rest_info의 favorites와 일치하는 값을 출력하려고 하였습니다.

     

    이번에는 맞겠지 하며 신나게 실행시켜봤지만...

     

     

    아....

    이번에는 일식값이 두 개나 나왔습니다...

    아니 근데 오대산산채전문점 뭔데..?

    저런 음식점 이름으로.. 일식..?

     

     

     

    그대로 멘탈이 나가버렸습니다

    .

    .

    .

     

    다행히도 favorites이 둘 다 230이라는 힌트를 금방 찾았습니다.

    서브쿼리에서 max(favorites)값을 넘겨줬는데

    만약 중복값이 발생한다면 이럴 수도 있지 않을까 싶었습니다.

     

     

     

    찾아보니까 역쉬...

    오대산산채전문점의 favorites는 230였습니다.

    그리고 일식도 아닌 한식이었습니다!

     

    일식으로 나온 이유는 당연하게도

    230이라는 숫자 때문에 일식으로 인식한 것..!

     

    그래서 이번에는 음식 타입과 favorites 정보를 함께 join하였습니다.

     

    SELECT a.food_type, r.rest_id, r.rest_name, r.favorites
    FROM (SELECT food_type, MAX(favorites) mf
                FROM rest_info
                GROUP BY 1
    ) a JOIN rest_info r ON a.mf = r.favorites
    AND a.food_type = r.food_type order by 1 desc

     

    정답

     

    이번에는 제대로 정답이 나왔습니다!

     

     

     

    SQL의 예약어 사용법에 대해 미숙한 점이 있음을 확인하는 계기가 되었습니다.

    다시 복습을 하며 빈틈을 채워야겠습니다.

Designed by Tistory.