📑 1. 문제설명
https://school.programmers.co.kr/learn/courses/30/lessons/144856
문제요약
테이블
- 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에 넣어야 한다. 그럼 AUTHOR_NAME을 안 넣으면 아예 쿼리가 안 돌아가나 안 되나? 하는 생각이 드는데, 보통 AUTHOR_ID가 기본키(고유값)라면, 이걸로만 그룹핑해도 같은 그룹 안에 항상 같은 AUTHOR_NAME이 따라온다고 한다.
하지만 데이터베이스마다 SQL 모드가 달라서,
- MySQL: ONLY_FULL_GROUP_BY 모드가 꺼져 있으면 → AUTHOR_ID만 넣어도 실행됨
- 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;
📌 TMI
아... 졸리다...
'코딩테스트 > SQL테스트' 카테고리의 다른 글
[프로그래머스] (MySQL) 우유와 요거트가 담긴 장바구니 문제풀이 (4) | 2025.08.28 |
---|---|
[프로그래머스] (MySQL) 입양 시각 구하기(2) 문제풀이 (4) | 2025.08.19 |
[프로그래머스] (MySQL) FrontEnd 개발자 찾기 (6) | 2025.08.17 |
[프로그래머스] (MySQL) 그룹별 조건에 맞는 식당 목록 출력하기 문제풀이 (5) | 2025.08.17 |
[프로그래머스] (MySQL) 노선별 평균 역 사이 거리 조회하기 (6) | 2025.08.14 |