Skip to main content

[SQL] 144856 저자 별 카테고리 별 매출액 집계하기

https://school.programmers.co.kr/learn/courses/30/lessons/144856

image.png

image.png

image.png

image.png

1. 문제

  • 테이블
    1. BOOK (BOOK_ID, CATEGORY, AUTHOR_ID, PRICE, PUBLISHED_DATE)
    2. AUTHOR (AUTHOR_ID, AUTHOR_NAME)
    3. 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에 넣어야 한다.

그럼 AUTHOR_NAME을 안 넣으면 아예 쿼리가 안 돌아가나 안 되나? 하는 생각이 드는데,

보통 AUTHOR_ID가 기본키(고유값)라면, 이걸로만 그룹핑해도 같은 그룹 안에 항상 같은 AUTHOR_NAME이 따라온다고 한다.

하지만 데이터베이스마다 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;