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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드설명

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

+ Recent posts