본문 바로가기

Skill Sets/SQL

[SQL] 카테고리 별 도서 판매량 집계하기(프로그래머스/MySQL/Level 3)

SMALL

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

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

 

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

(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/144855)


 

1. 문제 :  카테고리 별 도서 판매량 집계하기(Lv. 3)

 

 


 

2. 문제 설명

 

다음은 어느 한 서점에서 판매 중인 도서들의 도서 정보(BOOK), 판매 정보(BOOK_SALES) 테이블입니다.


'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 출판일

 

'BOOK_SALES' 테이블은 각 도서의 날짜 별 판매량 정보를 담은 테이블로

아래와 같은 구조로 되어있습니다.

 

[ 테이블 구조('BOOK_SALES') ]

COLUMN NAME TYPE NULLABLE DESCRIPTION
BOOK_ID INTEGER FALSE 도서 ID
SALES_DATE DATE FALSE 판매일
SALES INTEGER FALSE 판매량

 

[ 문제 ]

 

2022년 1월의 카테고리 별 도서 판매량을 합산하고,

카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문을 작성해주세요.


결과는 카테고리명을 기준으로 오름차순 정렬해주세요.

 

 

[ 예시 ]

 

예를 들어 BOOK 테이블과 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

 

BOOK_ID SALES_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권,

도서 ID 가 2 인 도서가 총 14권 이고,

도서 ID 가 3 인 도서가 총 2권 입니다.

카테고리 별로 판매량을 집계한 결과

그리고 

카테고리명을 오름차순으로 정렬하면 다음과 같이 나와야 합니다.

 

[ 출력 결과 ]

 

CATEGORY TOTAL_SALES
경제 16
인문 3

 


 

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. 2개의 테이블 조인하기(JOIN)
2. BOOK_SALES 테이블의 SALES_DATE 컬럼이 '2022년 1월'인 데이터 필터링(WHERE)
3. 카테고리별 집계(GROUP BY)
4. 판매량 집계(SUM)

5. 카테고리 기준으로 정렬

 

 

# [ 1안 쿼리 작성 설명 ]

 

 1  첫 번째 단계에서는 2개의 테이블을 조인하여 필요한 데이터를 가져왔어요!

 

BOOK 테이블을 기준으로 LEFT JOIN을 통해

 

BOOK_SALES 테이블을 조인했습니다!.

 

BOOK_ID 컬럼을 기준으로 BOOK 테이블과 BOOK_SALES 테이블을 조인합니다.

 

SELECT  A.*
               , B.*
  FROM  BOOK A
    LEFT
    JOIN  BOOK_SALES B
       ON  A.BOOK_ID = B.BOOK_ID

 

 2  두 번째 작업은 WHERE절에서 SALES_DATE 컬럼은 '2022-01'로 시작하는 데이터만 조회가 되도록

 

조건 필터링을 걸어주었습니다!

 

 WHERE  SALES_DATE LIKE '2022-01-%'

 

 3  세 번째 작업은 GROUP BY 절을 사용하여 그룹화를 해주었습니다!

 

카테고리(B.CATEGORY)를 기준으로 데이터를 그룹화를 해주었어요!

 

GROUP
        BY  A.CATEGORY

 

 4  네 번째 작업은 판매량을 더해주었요!

 

BOOK_SALES 테이블의 SALES 부분에서 BOOK_ID별로 팔린 책의 수를 이미 담고 있기 떄문에

 

SUM(B.SALES)를 사용하여 계산하고

 

이렇게 계산된 값은 TOTAL_SALES라는 별칭으로 지정해줬어요!

 

SELECT  A.CATEGORY CATEGORY
               , SUM(B.SALES) TOTAL_SALES
  FROM  BOOK A
    LEFT
    JOIN  BOOK_SALES B
       ON  A.BOOK_ID = B.BOOK_ID
WHERE  B.SALES_DATE LIKE '2022-01-%'

GROUP
        BY  A.CATEGORY

 

 5  마지막으로는 요구사항에 맞게 정렬했어요!

카테고리(B.CATEGORY)를 기준으로 오름차순으로 정렬했습니다!

 

SELECT  A.CATEGORY CATEGORY
               , SUM(B.SALES) TOTAL_SALES
  FROM  BOOK A
    LEFT
    JOIN  BOOK_SALES B
       ON  A.BOOK_ID = B.BOOK_ID
WHERE  B.SALES_DATE LIKE '2022-01-%'

GROUP
        BY  A.CATEGORY
ORDER

        BY  A.CATEGORY ASC

 

정답...!


 

4. 데코의 문제 풀이 후기

이번 문제는 난이도 3단계의 문제라고 하지만 체감 난이도는 난이도 1단계로 느껴지네요!

 

GROUP BY를 이용할수 있는지 물어보는 문제라고 생각이 드네요!

 

새로운 부분이나 이전 문제에서 모두 다룬 것들을 이용해서

 

따로 코멘트할 것은 없는 문제입니다..!

 

혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요! 

 



이번 문제는 2개의 테이블을 파악하고 JOIN하여 요구사항에 맞는 결과를 산출하는

 

SQL 쿼리를 작성해 보았습니다!

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

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

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

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

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

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

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

 

 

 

 

LIST