문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/131117
SELECT A.PRODUCT_ID, A.PRODUCT_NAME, SUM(B.AMOUNT * A.PRICE) AS TOTAL_SALES
FROM FOOD_PRODUCT A
JOIN FOOD_ORDER B ON A.PRODUCT_ID = B.PRODUCT_ID
WHERE B.PRODUCE_DATE LIKE '2022-05%'
GROUP BY A.PRODUCT_ID, A.PRODUCT_NAME
ORDER BY TOTAL_SALES DESC, A.PRODUCT_ID ASC;
SQL에서 GROUP BY 절을 사용할 때,
SELECT 절에 있는 모든 컬럼은 GROUP BY 절에 포함하거나, 집계 함수로 감싸야 한다.
즉, GROUP BY A.PRODUCT_ID만 사용하고
A.PRODUCT_NAME을 포함하지 않으면 대부분의 SQL 엔진에서 에러가 발생한다.
이 규칙은 SQL 표준에서 GROUP BY에 포함되지 않은 컬럼이
SELECT에 나올 때 어떤 값을 반환해야 하는지 애매해지는 것을 방지하기 위해서다.
GROUP BY A.PRODUCT_ID만 사용하고 PRODUCT_NAME을 집계 함수 없이 사용하면,
동일한 PRODUCT_ID에 여러 PRODUCT_NAME이 있을 때
어떤 이름을 반환해야 할지 SQL 엔진이 결정할 수 없기 때문에 애매해진다.
따라서 GROUP BY에 PRODUCT_NAME도 추가하면,
각각의 PRODUCT_ID와 PRODUCT_NAME의 조합이 하나의 그룹으로 처리되면서
SQL 엔진이 정확히 어떤 데이터를 반환해야 할지 알 수 있다.
만약 상품 ID만으로 그룹핑할 수 있는 상황이라면 ?!
ㄴ PRODUCT_ID가 기본 키라서 PRODUCT_NAME이 항상 같은 값이라면,
(= PRODUCT_ID가 기본 키(Primary Key)이면, 한 테이블에서 동일한 PRODUCT_ID 값을 가진 행이 중복될 수 없다.
따라서 PRODUCT_NAME도 항상 같은 값을 가지게 된다.
즉, 같은 PRODUCT_ID에 대해 여러 개의 PRODUCT_NAME 값이 존재할 가능성이 없다는 의미다. )
대부분의 SQL 엔진에서 GROUP BY PRODUCT_ID로만 써도 정상 작동한다.
다만, SQL 쿼리 작성에서 일관성과 명확성을 유지하기 위해 둘 다 포함하는 것이 좋다.
320x100
'PRACTICE > SQL' 카테고리의 다른 글
[MySQL] 4단계 5. 서울에 위치한 식당 목록 출력하기 (0) | 2025.01.31 |
---|---|
[MySQL] 4단계 4. 취소되지 않은 진료 예약 조회하기 (0) | 2025.01.30 |
[MySQL] 4단계 2. 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2025.01.28 |
[MySQL] 4단계 1. 보호소에서 중성화한 동물 (0) | 2025.01.27 |
[MySQL] 3단계 21. 대장균의 크기에 따라 분류하기 2 (0) | 2025.01.25 |