새소식

Programmers Coding Test/MySQL

[프로그래머스 144855] MySQL - Level3 카테고리 별 도서 판매량 집계하기

  • -

 

카테고리 별 도서 판매량 집계하기

 

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

 

프로그래머스

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

programmers.co.kr

 

 

1)  문제

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

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 테이블은 각 도서의 날짜 별 판매량 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.

 

 

Column name Type Nullable Description
BOOK_ID INTEGER FALSE 도서 ID
SALES_DATE DATE FALSE 판매일
SALES INTEGER FALSE 판매량

 

 

문제
2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문을 작성해주세요.

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

 

 

 

 

 

2)  예시

 

예를 들어, BOOK 테이블이 아래와 같고

 

BOOK_ID CATEGORY AUTHOR_ID PRICE PUBLISHED_DATE
1 인문 1 10,000 2020-01-01
2 경제 1 9,000 2021-02-05
3 경제 2 9,000 2021-03-11

 

 

 

BOOK_SALES 테이블이 다음과 같다면

 

 

 

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
인문 3
경제 16

 

 

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

 

 

CATEGORY TOTAL_SALES
경제 16
인문 3

 

 

 

 

 

 

 

3)  풀이

 

 

BOOK 테이블을 B, BOOK_SALES 테이블을 S로 지정합니다.

 


SELECT B.CATEGORY, SUM(S.SALES) AS TOTAL_SALES FROM BOOK AS B
카테고리를 조회하고,

아래에서 카테고리별로 그룹화해주므로, SALES(판매량) 값을 카테고리별로 SUM 해준 것을

TOTAL_SALES 컬럼으로 나타내줍니다.

 


INNER JOIN BOOK_SALES AS S ON B.BOOK_ID = S.BOOK_ID

두 테이블을 BOOK_ID로 연결해줍니다.



WHERE S.SALES_DATE LIKE '2022-01%'
2022년 1월에 판매된 도서로 제한해야하므로, SALES_DATE에 '2022-01' 값이 포함된 것을 조건으로합니다.

 


GROUP BY B.CATEGORY

결과값이 카테고리별로 나와야하므로, 카테고리로 그룹화해줍니다.

 


ORDER BY B.CATEGORY ASC;

카테고리 오름차순으로 정렬해줍니다.

 

 

 

 

※ JOIN

테이블 간의 연결 작업을 수행하는데 사용되는 키워드

 

JOIN 유형 설명 JOIN 조건
INNER JOIN 두 테이블 사이에서 일치하는 행만 반환합니다. 조건을 ON 절에 지정
LEFT JOIN
(LEFT OUTER JOIN)
왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 행을 반환합니다. 조건을 ON 절에 지정
RIGHT JOIN
(RIGHT OUTER JOIN)
오른쪽 테이블의 모든 행과 일치하는 왼쪽 테이블의 행을 반환합니다. 조건을 ON 절에 지정
FULL OUTER JOIN 양쪽 테이블의 모든 행을 반환하며, 일치하지 않는 행은 NULL 값으로 채워집니다. 조건을 ON 절에 지정
CROSS JOIN 두 테이블의 모든 행을 조합하여 반환합니다. 조건이 필요 없음
NATURAL JOIN 두 테이블 사이에서 칼럼 이름이 동일한 칼럼들을 기반으로 일치하는 행을 반환합니다. 조건이 필요 없음
SELF JOIN 하나의 테이블을 여러 번 사용하여 자체와 조인하는 것을 의미합니다. 별명으로 조인
USING 절 두 테이블 사이에서 일치하는 칼럼들을 지정하여 사용합니다. 조건을 USING 절에 지정

 

 

 

 

 

 

 

 

4)  코드

 

SELECT B.CATEGORY, SUM(S.SALES) AS TOTAL_SALES FROM BOOK AS B
INNER JOIN BOOK_SALES AS S ON B.BOOK_ID = S.BOOK_ID
WHERE S.SALES_DATE LIKE '2022-01%'
GROUP BY B.CATEGORY
ORDER BY B.CATEGORY ASC;

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.