✅문제 설명
다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.
✅ REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
✅처음 내가 작성한 코드 (오답)
SELECT
FOOD_TYPE,
REST_ID,
REST_NAME,
MAX(FAVORITES) AS FAVORITES
FROM
REST_INFO
GROUP BY
FOOD_TYPE
ORDER BY
FOOD_TYPE DESC
내가 작성한 코드가 음식종류별 (FOOD_TYPE) 별 즐겨찾기가 가장 많은 식당이니 GROUP BY로 묶어주고 GROUP 중에 MAX(FAVRORITES) 인 행을 추출하는 코드라고 생각했다. 하지만, 착각이었습니다... ㅎㅎ
다른 컬럼들은 GROUP 을 묶어준 상태에서 가장 상단의 행을 가져왔고, MAX(FAVORITES) 값만 그룹중에 가장 MAX 인 FAVORITES;즐겨찾기수 를 가져왔습니다. 이게 무슨말이냐면
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
ORDER BY FOOD_TYPE, FAVORITES DESC
이 코드를 실행해서 봤을 때,
여기서 볼 수 있듯이 각 FOOD_TYPE 별로 가장 즐겨찾기 수가 많은 데이터들은 아래와 같다
분식, 애플우스, 151
양식, 따띠따띠뜨, 102
일식, 스시사카우스, 230
한식, 은돼지식당, 734
중식, 만정, 20
이렇게 나와야 하는데 위에서 내가 돌린 코드의 결과는,, 아래와 같다. 일식의 경우에 230 은 맞지만 하이가쯔네..?가 나왔다.
만약, FOOD_TYPE 별로 MAX(FAVORITES) 를 추출하는 것이었으면 정답이 될 수도 있지만, 다른 컬럼들은 GROUP BY 로 묶였을 때, 임의로 제일 위의 값이 선택되어 추출되었기 때문이다.
따라서, 정답을 내기 위해서는 SUBQUERY 가 필요했는데,
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES)
IN
(SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE )
ORDER BY FOOD_TYPE DESC
1. 먼저, SUBQUERY 를 통해서 FOOD_TYPE 별로 MAX(FAVORITES) 값을 가진 테이블을 생성한다.
2. WHERE 절에 (FOOD_TYPE, FAVORITES) 를 명시해주고 이 값들이 SUBQUERY 를 통해서 나온 값을 가지는 행을 필터링한다 !
3. SELECT 문에서 필요한 컬럼 명들을 명시해줘서 WHERE 절을 만족하는 행들을 추출한다.
4. 마지막으로 FOOD_TYPE 내림차순 정렬을 해준다 !
다른 컬럼들과 함께 출력될 때는 집계함수를 사용하는 컬럼은 GROUP BY의 영향을 받지만 다른 행들은 받지 않는 다는 것을 알게 되었음.
따라서 다른 컬럼들과 함께 추출을 원할 때는 서브쿼리와 같이 GROUP BY 를 통해서 WHERE 절에 사용할 조건을 만들어 외부 쿼리를 통해 다시 추출해야 함.
'Programming > SQL' 카테고리의 다른 글
[프로그래머스 SQL 고득점 kit] 그룹별 조건에 맞는 식당 목록 출력하기 (4) | 2024.07.22 |
---|---|
[프로그래머스 SQL] 조건에 맞는 사용자 정보 조회하기 (0) | 2024.07.08 |
[TIL 0702] SQL, Pivot Table 에 대한 이해 (5주차 과제를 바탕으로) (0) | 2024.07.02 |
[TIL 0628] SQL 세션 과제 수행 [기록용] (0) | 2024.06.28 |
[TIL 0628] 루시와 엘라 못 찾을 뻔한 썰 (0) | 2024.06.28 |