안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "저자 별 카테고리 별 매출액 집계하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/144856)
1. 문제 : 저자 별 카테고리 별 매출액 집계하기(Lv. 4)
2. 문제 설명
다음은 어느 한 서점에서 판매 중인 도서들의 도서 정보(BOOK), 저자 정보(AUTHOR) 테이블입니다.
'BOOK' 테이블은 각 도서의 정보를 담은 테이블로
아래와 같은 구조로 되어있습니다.
[ 테이블 구조('BOOK') ]
COLUMN NAME | TYPE | NULLABLE | DESCRIPTION |
BOOK_ID | INTEGER | FALSE | 도서 ID |
CATEGORY | VARCHAR(N) | FALSE | 카테고리 (경제, 인문, 소설, 생활, 기술) |
AUTHOR_ID | INTEGER | FALSE | 저자 ID |
PRICE | INTEGER | FALSE | 판매가(원) |
PUBLISHED_DATE | DATE | FALSE | 출판일 |
'AUTHOR' 테이블은 도서의 저자의 정보를 담은 테이블로
아래와 같은 구조로 되어있습니다.
[ 테이블 구조('AUTHOR') ]
COLUMN NAME | TYPE | NULLABLE | DESCRIPTION |
AUTHOR_ID | INTEGER | FALSE | 저자 ID |
AUTHOR_NAME | VARCHAR(N) | FALSE | 저자명 |
'BOOK_SALES' 테이블은 각 도서의 날짜 별 판매량 정보를 담은 테이블로
아래와 같은 구조로 되어있습니다.
[ 테이블 구조('BOOK_SALES') ]
COLUMN NAME | TYPE | NULLABLE | DESCRIPTION |
BOOK_ID | INTEGER | FALSE | 도서 ID |
SALES_DATE | DATE | FALSE | 판매일 |
SALES | INTEGER | FALSE | 판매량 |
[ 문제 ]
2022년 1월의 도서 판매 데이터를 기준으로
저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여,
저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를
출력하는 SQL문을 작성해주세요.
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.
[ 예시 ]
예를 들어 BOOK 테이블과 AUTHOR 테이블, BOOK_SALES 테이블이 다음과 같다면
BOOK_ID | ANIMAL_TYPE | AUTHOR_ID | PRICE | PUBLISHED_DATE |
1 | 인문 | 1 | 10000 | 2020-01-01 |
2 | 경제 | 1 | 9000 | 2021-02-05 |
3 | 경제 | 2 | 9000 | 2021-03-11 |
AUTHOR_ID | AUTHOR_NAME |
1 | 홍길동 |
2 | 김영호 |
BOOK_ID | PUBLISHED_DATE | SALES |
1 | 2022-01-01 | 2 |
2 | 2022-01-02 | 3 |
1 | 2022-01-05 | 1 |
2 | 2022-01-20 | 5 |
2 | 2022-01-21 | 6 |
3 | 2022-01-22 | 2 |
2 | 2022-02-11 | 3 |
2022년 1월의 도서 별 총 매출액은 도서 ID 가 1 인 도서가 총 3권 * 10,000원 = 30,000원,
도서 ID 가 2 인 도서가 총 14권 * 9,000 = 126,000원 이고,
도서 ID 가 3 인 도서가 총 2권 * 9,000 = 18,000원 입니다.
저자 별 카테고리 별로 매출액을 집계
그리고
저자 ID, 카테고리 순으로 내림차순 정렬하면 다음과 같이 나와야 합니다.
[ 출력 결과 ]
AUTHOR_ID | AUTHOR_NAME | CATEGORY | TOTAL_SALES |
1 | 홍길동 | 인문 | 30000 |
1 | 홍길동 | 경제 | 126000 |
2 | 김영호 | 경제 | 18000 |
3. 문제 풀이
-- 1안
SELECT A.AUTHOR_ID
, A.AUTHOR_NAME
, B.CATEGORY
, SUM(C.SALES*B.PRICE) AS TOTAL_SALES
FROM BOOK B
LEFT
JOIN AUTHOR A
ON A.AUTHOR_ID = B.AUTHOR_ID
LEFT
JOIN BOOK_SALES C
ON B.BOOK_ID = C.BOOK_ID
WHERE SALES_DATE LIKE '2022-01%'
GROUP
BY A.AUTHOR_ID
, A.AUTHOR_NAME
, B.CATEGORY
ORDER
BY A.AUTHOR_ID ASC
, B.CATEGORY DESC
이번 문제는 1안 한 가지로 작성했습니다!
# 1안 풀이 설명
# [ 문제 접근 설명 ]
문제를 읽고 조건에 맞는 쿼리를 작성하기 위해서 다음과 같이 다섯 가지 단계로 진행했어요!
1. 3개의 테이블 조인하기(JOIN)
2. BOOK_SALES 테이블의 SALES_DATE 컬럼이 '2022년 1월'인 데이터 필터링(WHERE)
3. 저자 별 카테고리별 집계(GROUP BY)
4. 매출액 계산
5. 저자 ID, 카테고리기준으로 정렬
# [ 1안 쿼리 작성 설명 ]
1 첫 번째 단계에서는 3개의 테이블을 조인하여 필요한 데이터를 가져왔어요!
BOOK 테이블을 기준으로 LEFT JOIN을 통해
AUTHOR 테이블, 그리고 BOOK_SALES 테이블을 조인했습니다!.
AUTHOR_ID 컬럼을 기준으로 BOOK 테이블과 AUTHOR 테이블을 조인하고,
BOOK_ID 컬럼을 기준으로 BOOK 테이블과 BOOK_SALES 테이블을 조인합니다.
SELECT *
FROM BOOK B
LEFT
JOIN AUTHOR A
ON A.AUTHOR_ID = B.AUTHOR_ID
LEFT
JOIN BOOK_SALES C
ON B.BOOK_ID = C.BOOK_ID
2 두 번째 작업은 WHERE절에서 SALES_DATE 컬럼은 '2022-01'로 시작하는 데이터만 조회가 되도록
조건 필터링을 걸어주었습니다!
WHERE SALES_DATE LIKE '2022-01%'
3 세 번째 작업은 GROUP BY 절을 사용하여 그룹화를 해주었습니다!
저자 ID(A.AUTHOR_ID), 저자 이름(A.AUTHOR_NAME), 그리고 카테고리(B.CATEGORY)를 기준으로 데이터를 그룹화를 해주었어요!
GROUP
BY A.AUTHOR_ID
, A.AUTHOR_NAME
, B.CATEGORY
4 네 번째 작업은 매출액을 계산했어요!
SUM(C.SALES * B.PRICE)를 사용하여 BOOK_SALES 테이블의 SALES 컬럼과 BOOK 테이블의 PRICE 컬럼을 곱하여 계산했습니다!
이렇게 계산된 값은 TOTAL_SALES라는 별칭으로 지정해줬어요!
SELECT A.AUTHOR_ID
, A.AUTHOR_NAME
, B.CATEGORY
, SUM(C.SALES*B.PRICE) AS TOTAL_SALES
5 마지막으로는 요구사항에 맞게 정렬했어요!
저자 ID(A.AUTHOR_ID)를 오름차순으로, 그리고 카테고리(B.CATEGORY)를 내림차순으로 정렬했습니다!
SELECT A.AUTHOR_ID
, A.AUTHOR_NAME
, B.CATEGORY
, SUM(C.SALES*B.PRICE) AS TOTAL_SALES
FROM BOOK B
LEFT
JOIN AUTHOR A
ON A.AUTHOR_ID = B.AUTHOR_ID
LEFT
JOIN BOOK_SALES C
ON B.BOOK_ID = C.BOOK_ID
WHERE SALES_DATE LIKE '2022-01%'
GROUP
BY A.AUTHOR_ID
, A.AUTHOR_NAME
, B.CATEGORY
ORDER
BY A.AUTHOR_ID ASC
, B.CATEGORY DESC
4. 데코의 문제 풀이 후기
이번 문제는 난이도 4단계의 문제였음에도, 3개의 테이블을 JOIN하는 과정부터
총 금액을 산출하는 방법까지
체감 난이도는 난이도 2단계로 느껴지네요!
새로운 부분이나 이전 문제에서 모두 다룬 것들을 이용해서
따로 코멘트할 것은 없습니다!
혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요!
이번 문제는 3개의 테이블을 결합하여 요구사항에 맞게 쿼리를 작성해 보았습니다!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 취소되지 않은 진료 예약 조회하기(프로그래머스/MySQL/Level 4) (51) | 2023.09.01 |
---|---|
[SQL] 카테고리 별 도서 판매량 집계하기(프로그래머스/MySQL/Level 3) (33) | 2023.07.16 |
[SQL] 자동차 대여 기록 별 대여 금액 구하기(프로그래머스/MySQL/Level 4) (33) | 2023.06.19 |
[SQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(프로그래머스/MySQL/Level 4) (48) | 2023.06.08 |
[SQL] 대여 기록이 존재하는 자동차 리스트 구하기(프로그래머스/MySQL/Level 3) (38) | 2023.04.25 |