https://school.programmers.co.kr/learn/courses/30/lessons/144856
코드설명
INNER JOIN + GROUP BY + SUM 을 활용합니다.
문제에서 유의해야할점은, TOTAL_SALES 연산 부분입니다.
아래의 경우 B.PRICE * SUM(BS.SALES) 방식을 사용합니다.
SELECT A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, B.PRICE * SUM(BS.SALES) AS TOTAL_SALES
이 방식으로 하면 틀린 결과가 나옵니다.
이유는, 우리가 구하는 것은 저자별로 각 카테고리별 책의 총합 매출액을 구하는 것이기에, 각 책의 가격이 다를 수 있습니다. 그렇기에, GROUP BY 과정에서 올바르게 그룹화된 아래처럼 연산해야, 각 책에 맞는 가격과 판매량이 계산됩니다.
SELECT A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, SUM(B.PRICE * BS.SALES) AS TOTAL_SALES
좀 더 생각해보면, 한 작가가 같은 카테고리 안에 책을 10권 썼다고 해봅시다.
이떄 만약 GROUP BY 에 BOOK_ID 별로 진행했다면 상관없습니다.
하지만, 우리는 GROUP BY 로 작가의 정보, 책의 카테고리 별로 하기 때문에 만약 B.PRICE * SUM(BS.SALES)로 진행한다면, 책의 카테고리 중 하나의 가격으로 곱해지는 것 입니다.
코드
SELECT A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, SUM(B.PRICE * BS.SALES) AS TOTAL_SALES
FROM BOOK AS B
INNER JOIN AUTHOR AS A
ON B.AUTHOR_ID = A.AUTHOR_ID
INNER JOIN BOOK_SALES AS BS
ON B.BOOK_ID = BS.BOOK_ID
WHERE DATE_FORMAT(BS.SALES_DATE, '%Y-%m') = '2022-01'
GROUP BY A.AUTHOR_ID, B.CATEGORY
ORDER BY A.AUTHOR_ID ASC, B.CATEGORY DESC
ORACLE
-- 코드를 입력하세요
SELECT A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, SUM(BS.SALES * B.PRICE) AS TOTAL_SALES
FROM BOOK B
INNER JOIN AUTHOR A
ON B.AUTHOR_ID = A.AUTHOR_ID
INNER JOIN BOOK_SALES BS
ON B.BOOK_ID = BS.BOOK_ID
WHERE TO_CHAR(BS.SALES_DATE, 'YYYY-MM') = '2022-01'
GROUP BY A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY
ORDER BY A.AUTHOR_ID ASC, B.CATEGORY DESC