본문 바로가기

Algorithm

[SQL 알고리즘] 프로그래머스 - 저자 별 카테고리 별 매출액 집계하기

✅ 프로그래머스 문제 - 저자 별 카테고리 별 매출액 집계하기

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

✅ 코드

WITH SALES AS (
    SELECT BOOK_ID, SUM(SALES) AS SALES
    FROM BOOK_SALES 
    WHERE SALES_DATE LIKE '2022-01%'
    GROUP BY BOOK_ID
)
SELECT  A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, (S.SALES * B.PRICE) AS TOTAL_SALES 
FROM SALES S 
INNER JOIN BOOK B ON S.BOOK_ID = B.BOOK_ID
INNER JOIN AUTHOR A ON B.AUTHOR_ID = A.AUTHOR_ID
ORDER BY A.AUTHOR_ID , B.CATEGORY

 

✏️ 문제점

처음 내가 짠 코드인데 너무 단순하게 생각한 점이 있었다. 문제는 이렇게 짜면 각각의 책에 대한 매출을 구하는 코드다.

문제를 카테고리별 , 저자별 매출액을 구하는것을 나는 그냥 그게 책별로 매출을 구하면 같은거 아닌가 라고 생각을하고 아무생각없이 코드를 짜고이해를 못하고있었는데 자세히 보니 다음과 같은 경우 문제가 생긴다.

 

✓  BOOK 테이블

BOOK_ID AUTHOR_ID CATEGORY PRICE
1 101 Fiction 1000
2 101 Non-Fiction 1500
3 102 Fiction 1200
4 102 Fiction 1200

 

 

✓  BOOK_SALES 테이블

BOOK_ID SALES SALES_DATE
1 10 2022-01-05
2 5 2022-01-06
3 8 2022-01-07
4 12 2022-01-08

 

이렇게 테이블이 있을 경우 내가 짠 코드는 

책 1 : 10000

책 2 : 7500

책 3 : 9600

책 4 : 14400

이렇게 책별로 가격이 합산되서 나온다.

즉 책별이니 결과가 이렇게 나온다.

AUTHOR_ID CATEGORY TOTAL_SALES
101 FICTION 10000
101 FICTION 7500
102 FICTION 24000

 

책은 다르지만 같은 카테고리와 같은 저자가 낼수있기 때문이다 

 

하지만 문제에서 나온건 카테고리별, 저자별이기때문에 이렇게 나와야된다

AUTHOR_ID CATEGORY TOTAL_SALES
101 FICTION 10000
101 NON-FICTION 7500
102 FICTION 24000

 

 


 

✅ 코드

WITH SALES AS (
    SELECT BOOK_ID, SUM(SALES) AS SALES
    FROM BOOK_SALES 
    WHERE SALES_DATE LIKE '2022-01%'
    GROUP BY BOOK_ID
)
SELECT  A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, (S.SALES * B.PRICE) AS TOTAL_SALES 
FROM SALES S 
INNER JOIN BOOK B ON S.BOOK_ID = B.BOOK_ID
INNER JOIN AUTHOR A ON B.AUTHOR_ID = A.AUTHOR_ID
GROUP BY A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY
ORDER BY A.AUTHOR_ID , B.CATEGORY

 

그렇다면 이렇게 GROUP BY 를 추가하면 어떨까?

해당값을 하면 결과는 이렇게 나온다.

 

AUTHOR_ID CATEGORY TOTAL_SALES
101 FICTION 10000
101 NON-FICTION 7500
102 FICTION 24000

 

얼핏보면 정답같아 보이지만 애초에 WITH의 서브쿼리가 문제가 있다.

해당 서브쿼리는 BOOK_ID별로 판매량을 합산한후 이값과 가격을 곱하기 때문에 TOTAL_SALES의 가격이 틀리게 나온다. 매출액이 추가적으로 더해져서 나오게되는것이다.

 

1. 바로 JOIN을 이용하는 방법

 

 

 

SELECT A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, SUM(B.PRICE * BS.SALES) AS TOTAL_SALES
FROM BOOK B
JOIN AUTHOR A ON B.AUTHOR_ID = A.AUTHOR_ID
JOIN BOOK_SALES BS ON B.BOOK_ID = BS.BOOK_ID
WHERE BS.SALES_DATE LIKE '2022-01%'
GROUP BY A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY
ORDER BY A.AUTHOR_ID ASC, B.CATEGORY DESC

 

2.WITH절을 이용하는 방법

WITH A AS (
    SELECT A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY,B.PRICE, C.SALES_DATE, C.SALES
    FROM BOOK_SALES C
    LEFT JOIN BOOK B ON B.BOOK_ID = C.BOOK_ID
    LEFT JOIN AUTHOR A ON A.AUTHOR_ID = B.AUTHOR_ID
    WHERE C.SALES_DATE LIKE '2022-01%'
),
B AS (
    SELECT  A.AUTHOR_ID, A.AUTHOR_NAME, A.CATEGORY , ( A.PRICE * A.SALES )  AS TOTAL_SALES
FROM A 
)
SELECT AUTHOR_ID,AUTHOR_NAME, CATEGORY, SUM(TOTAL_SALES)
FROM B
GROUP BY AUTHOR_ID, AUTHOR_NAME, CATEGORY
ORDER BY AUTHOR_ID, CATEGORY DESC

 

 

✏️ 공부한점

- 문제의 의도를 파악해야되고 GROUP BY문제가 나오면 GROUP BY 문제는 집계 직전 테이블을 만든다는 생각을하고 차근차근 풀면된다.