본문 바로가기

Skill Sets/SQL

[SQL] 저자 별 카테고리 별 매출액 집계하기(프로그래머스/MySQL/Level 4)

SMALL

안녕하세요! 데코입니다!

오늘은 프로그래머스 코딩테스트 연습에 있는 "저자 별 카테고리 별 매출액 집계하기" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

(출처 : 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개의 테이블을 결합하여 요구사항에 맞게 쿼리를 작성해 보았습니다!

설명이 어려운 부분 혹은 잘 이해가 안 가는 부분

그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!

빠르게 궁금증을 해결해 드릴게요!

공감과 댓글은 큰 힘이 됩니다!

오늘도 블로그 방문해 주시고

포스팅 읽어주셔서 감사합니다!

 

 

LIST