꾸물꾸물 졔의 개발공부

[MySQL] 프로그래머스 - 저자 별 카테고리 별 매출액 집계하기 (GROUP BY, SUM, JOIN) 본문

알고리즘/SQL

[MySQL] 프로그래머스 - 저자 별 카테고리 별 매출액 집계하기 (GROUP BY, SUM, JOIN)

체제 2023. 5. 23. 15:34

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

 

프로그래머스

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

programmers.co.kr

 

 

문제

2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.


구현 과정

  • BOOK, AUTHOR, BOOK_SALES 테이블 JOIN 
  • 2022년 1월의 도서 판매 데이터 추출 
  • 저자 별, 카테고리 별 매출액 조회 

 

1️⃣ BOOK, AUTHOR, BOOK_SALES 테이블 JOIN 

조회에 필요한 데이터 컬럼이 3개의 테이블에 나뉘어 저장되어 있으므로 3개의 테이블을 조인한다.

  • BOOK - AUTHOR : AUTHOR_ID 기준으로 INNER JOIN 
  • BOOK - BOOK_SALES : BOOK_ID 기준으로 INNER JOIN 
SELECT *
FROM BOOK B 
JOIN AUTHOR A ON A.AUTHOR_ID = B.AUTHOR_ID 
JOIN BOOK_SALES S ON S.BOOK_ID = B.BOOK_ID

👉 각 테이블명이 길기 때문에 B, A, S 의 별칭 사용 

 

 

2️⃣ 2022년 1월의 도서 판매 데이터 추출 

JOIN 한 테이블 중, 도서의 판매 날짜(BOOK_SALES 테이블의 SALES_DATE 컬럼)가 2022년 1월인 데이터를 찾는다. SALES_DATE이 '2022-01'로 시작하는 데이터를 찾기 위해 LIKE 연산자와 '%' 을 사용한다. 

SELECT * 
FROM BOOK B 
JOIN AUTHOR A ON A.AUTHOR_ID = B.AUTHOR_ID 
JOIN BOOK_SALES S ON S.BOOK_ID = B.BOOK_ID 
WHERE S.SALES_DATE LIKE '2022-01%';

 

3️⃣ 저자 별, 카테고리 별 매출액 조회 

저자, 카테고리를 기준으로 그룹화하여 매출액의 총합을 구한다. 두개 이상의 컬럼을 기준으로 그룹화 하기 위해서는 GROUP BY 절에 콤마(,)로 컬럼을 나열한다. 

 

저자, 카테고리 별로 BOOK_ID 가 두개 이상일 수 있기 때문에 판매량*판매가의 >총합<을 구해야 한다. 집계함수 SUM 을 사용하여 매출액의 합을 구한다. 

  • 판매량 : BOOK_SALES 테이블의 SALES 컬럼 
  • 판매가 : BOOK 테이블의 PRICE 컬럼 
  • 총 매출액 : SUM(SALES * PRICE) 
SELECT A.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, SUM(S.SALES * B.PRICE) AS TOTAL_SALES
FROM BOOK B 
JOIN AUTHOR A ON A.AUTHOR_ID = B.AUTHOR_ID 
JOIN BOOK_SALES S ON S.BOOK_ID = B.BOOK_ID 
WHERE S.SALES_DATE LIKE '2022-01%'
GROUP BY B.AUTHOR_ID, B.CATEGORY

✔️코드

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