[SQL] 144856 저자 별 카테고리 별 매출액 집계하기
https://school.programmers.co.kr/learn/courses/30/lessons/144856
1. 문제
- 테이블
- BOOK (BOOK_ID, CATEGORY, AUTHOR_ID, PRICE, PUBLISHED_DATE)
- AUTHOR (AUTHOR_ID, AUTHOR_NAME)
- BOOK_SALES (BOOK_ID, SALES_DATE, SALES)
- 목표
- 2022년 1월 판매 데이터를 기준으로
- 저자별 + 카테고리별 매출액 (TOTAL_SALES = 판매량 * 판매가) 계산
- 출력 컬럼
- AUTHOR_ID, AUTHOR_NAME, CATEGORY, TOTAL_SALES
- 정렬 조건
- AUTHOR ID ASC, CATEGORY DESC
2. 오답쿼리
SELECT a.AUTHOR_ID,
a.AUTHOR_NAME,
CATEGORY,
SUM(b.PRICE * s.SALES) AS TOTAL_SALES
FROM BOOK b
JOIN AUTHOR a ON b.AUTHOR_ID = a.AUTHOR_ID
JOIN BOOK_SALES s ON b.BOOK_ID = s.BOOK_ID
WHERE YEAR(s.SALES_DATE) = 2022
AND MONTH(s.SALES_DATE) = 1
GROUP BY a.AUTHOR_ID, SUM(b.PRICE * s.SALES)
ORDER BY a.AUTHOR_ID, CATEGORY DESC;
1. GROUP BY절에는 집계함수를 사용 할 수 없다.
GROUP BY는 '그룹핑 기준 컬럼'을 정하는 거라서, 집계 함수는 올 수 없다. 아래와 같이 수정해야 한다.
GROUP BY a.AUTHOR_ID, a.AUTHOR_NAME, b.CATEGORY
'작가별 + 카테고리별 총 매출'이니까 AUTHOR_ID, CATEGORY로 그룹핑하는 것은 당연하다.
그런데 여기에 AUTHOR_NAME이 들어가는 이유는
👉 SELECT절에 있는 집계 함수가 아닌 컬럼은 반드시 GROUP BY에 포함되어야 한다.
는 규칙 때문이다.
즉, SUM, COUNT 같은 집계함수가 아닌 a.AUTHOR_ID
, a.AUTHOR_NAME
, b.CATEGORY
는 전부 GROUP BY에 넣어야 한다.
하지만 데이터베이스마다 SQL 모드가 달라서,
- MySQL: ONLY_FULL_GROUP_BY 모드가 꺼져 있으면 → AUTHOR_ID만 넣어도 실행됨 (AUTHOR_NAME이 자동 매칭)
- MySQL: ONLY_FULL_GROUP_BY 모드가 켜져 있으면 → AUTHOR_NAME도 꼭 GROUP BY에 넣어야 실행됨
그래서 안전하게 실행되도록 보통 AUTHOR_NAME도 같이 넣어준다.
3. 정답쿼리
SELECT a.AUTHOR_ID,
a.AUTHOR_NAME,
CATEGORY,
SUM(b.PRICE * s.SALES) AS TOTAL_SALES
FROM BOOK b
JOIN AUTHOR a ON b.AUTHOR_ID = a.AUTHOR_ID
JOIN BOOK_SALES s ON b.BOOK_ID = s.BOOK_ID
WHERE YEAR(s.SALES_DATE) = 2022
AND MONTH(s.SALES_DATE) = 1
GROUP BY a.AUTHOR_ID, a.AUTHOR_NAME, b.CATEGORY
ORDER BY a.AUTHOR_ID, CATEGORY DESC;