PRACTICE/SQL

[MySQL] 4단계 3. 5월 식품들의 총매출 조회하기

j1ngerhead 2025. 1. 29. 00:42

 

문제 링크

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