✅ 프로그래머스 문제 - 저자 별 카테고리 별 매출액 집계하기
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 문제는 집계 직전 테이블을 만든다는 생각을하고 차근차근 풀면된다.
'Algorithm' 카테고리의 다른 글
| [SQL 알고리즘] 프로그래머스 - 입양 시각 구하기 (2) | 2024.12.03 |
|---|---|
| [SQL 알고리즘] 프로그래머스 - 식품분류별 가장 비싼 식품의 정보 조회하기 (2) | 2024.11.27 |
| [SQL 알고리즘] 프로그래머스 - 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.11.27 |
| [SQL 알고리즘] 프로그래머스 - 언어별 개발자 분류하기 (0) | 2024.11.21 |
| [JAVA 알고리즘] charAt() 함수 (0) | 2024.04.04 |