안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "카테고리 별 도서 판매량 집계하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : 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 쿼리를 작성해 보았습니다!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 흉부외과 또는 일반외과 의사 목록 출력하기(프로그래머스/MySQL/Level 1) (70) | 2023.09.13 |
---|---|
[SQL] 취소되지 않은 진료 예약 조회하기(프로그래머스/MySQL/Level 4) (51) | 2023.09.01 |
[SQL] 저자 별 카테고리 별 매출액 집계하기(프로그래머스/MySQL/Level 4) (34) | 2023.07.10 |
[SQL] 자동차 대여 기록 별 대여 금액 구하기(프로그래머스/MySQL/Level 4) (33) | 2023.06.19 |
[SQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(프로그래머스/MySQL/Level 4) (48) | 2023.06.08 |