728x90
※ GROUP BY를 사용할 때 집계 함수를 사용하지 않아 임의의 값 중 어떤 값을 반환해야 할 지 모르는 필드가 존재하면
가장 상단에 있는 데이터들을 임의로 가져옴!
※ GROUP BY 구의 기준이 되는 필드가 아니거나 집계 함수를 통해 어떤 값을 반환해야 할 지 결정해주지 않은 필드를 SELECT 구에 사용할 경우 문법적으로 틀린 SQL 구문
EX) 즐겨찾기가 가장 많은 식당 정보 출력하기 - 오류
SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC
FOOD_TYPE으로 GROUP BY를 사용,
FOOD_TYPE, MAX(FAVORITES)는 반환해야 하는 값이 명확하지만,
REST_ID, REST_NAME에 대해서는 반환값이 모호하기 때문에
문제에서 요구하는 즐겨찾기수가 가장 많은 식당의 정보가 아닌 테이블에서 가장 상단의 식당 정보를 가져옴!
실제 FOOD_TYPE이 일식이고, 즐겨찾기 230인 식당 번호는 00004, 식당 이름은 스시사카우스이지만
위의 경우, REST_ID와 REST_NAME이 모두 잘못 들어가 있음
* 1. GROUP BY의 기준인 FOOD_TYPE과 2. 집계합수 MAX(FAVORITES)만 SELECT 하는 경우, 올바르게 GROUP BY 됨
SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
EX) 즐겨찾기가 가장 많은 식당 정보 출력하기 - 정답
SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES
FROM REST_INFO A JOIN (
SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
) B -- B: 각 카테고리별 최대 FAVORITES
ON A.FAVORITES = B.FAVORITES AND A.FOOD_TYPE = B.FOOD_TYPE -- B에 해당하는 컬럼만 남기기 (교집합)
ORDER BY FOOD_TYPE DESC
FOOD_TYPE과 FAVORTIES에 해당하는
올바른 REST_ID, REST_NAME를 구하기 위해선 JOIN 사용 필요
728x90
'𝙎𝙌𝙇' 카테고리의 다른 글
[MySQL/ORACLE] 그룹별 문자열 묶기 : GROUP_CONCAT / LISTAGG (1) | 2023.01.18 |
---|---|
[MySQL] 문자열 길이 : LENGTH() / CHAR_LENGTH() 차이 (0) | 2023.01.17 |
[MySQL] 문자열 자르기 : RIGHT() / LEFT() / SUBSTRING() / SUBSTRING_INDEX() (0) | 2023.01.16 |
[MySQL] NULL값 제외 COUNT : IS NOT NULL (0) | 2023.01.15 |
[MySQL] 반올림 : ROUND() / 버림 : TRUNCATE() (0) | 2023.01.15 |