꾸물꾸물 졔의 개발공부
[MySQL] 프로그래머스 - 저자 별 카테고리 별 매출액 집계하기 (GROUP BY, SUM, JOIN) 본문
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;
'알고리즘 > SQL' 카테고리의 다른 글
[MySQL] 프로그래머스 - 그룹별 조건에 맞는 식당 목록 출력하기 (GROUP BY, SubQuery) (0) | 2023.05.25 |
---|---|
[MySQL] 프로그래머스 - 주문량이 많은 아이스크림들 조회하기 (JOIN, LIMIT) (0) | 2023.05.24 |
[MySQL] 프로그래머스 - 취소되지 않은 진료 예약 조회하기 (JOIN, String) (0) | 2023.05.17 |
[MySQL] 프로그래머스 - 우유와 요거트가 담긴 장바구니 (GROUP_CONCAT, LIKE, SubQuery) (0) | 2023.05.17 |
[MySQL] 프로그래머스 - 년, 월, 성별 별 상품 구매 회원 수 구하기 (GROUP BY, DATE_FORMAT, DISTINCT) (0) | 2023.05.16 |