2024. 9. 14. 18:00ㆍSQL 고득점 Kit/GROUP BY
https://school.programmers.co.kr/learn/courses/30/lessons/144855
문제 설명
다음은 어느 한 서점에서 판매중인 도서들의 도서 정보(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문을 작성해주세요. 결과는 카테고리명을 기준으로 오름차순 정렬해주세요.
예시
예를 들어 BOOK 테이블과 BOOK_SALES 테이블이 다음과 같다면
<BOOK 테이블>
BOOK_ID | CATEGORY | AUTHOR_ID | PRICE | PUBLISHED_DATE |
1 | 인문 | 1 | 10000 | 2020-01-01 |
2 | 경제 | 1 | 9000 | 2021-02-05 |
3 | 경제 | 2 | 9000 | 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 |
2022년 1월에 판매된 카테고리별 도서 판매량을 합산하고, 각 카테고리의 총 판매량을 조회하는 문제입니다.
도서 정보와 판매 정보는 서로 도서 ID를 기준으로 연결되어 있고, 카데고리는 도서 정보에만 있습니다.
따라서 조인을 사용해 두 개의 테이블을 도서 ID를 기준으로 합치고, 합친 테이블에 GROUP BY를 적용해 카테고리별로 그룹을 묶겠습니다.
또한, 2022년 1월이라는 조건이 정해져 있기 때문에 WHERE 조건절을 활용하여 범위에 해당하는 정보들만 추출하겠습니다.
정답 코드를 작성해보겠습니다.
SELECT B.CATEGORY, SUM(S.SALES) AS TOTAL_SALES
FROM BOOK B
INNER JOIN
BOOK_SALES S
ON B.BOOK_ID = S.BOOK_ID
WHERE YEAR(S.SALES_DATE) = 2022
AND MONTH(S.SALES_DATE) = 1
GROUP BY B.CATEGORY
ORDER BY B.CATEGORY ASC;
우선 도서 테이블와 판매 정보 테이블을 이너 조인을 사용해, ID를 기준으로 하나의 테이블로 만듭니다.
그 다음, WHERE 조건절을 활용해 2022년 & 1월인 값들을 추출합니다.
카테고리를 기준으로 GROUP BY를 실행한 다음, 총 판매량을 SUM 함수로 추출하고 TOTAL_SALES라 명명합니다.
마지막으로 카테고리 이름을 기준으로 오름차순 정렬해준다면 문제를 풀 수 있습니다.
판매된 데이터만 출력하기 때문에 이너 조인만 사용하면 됩니다. 만약 판매되지 않은 데이터도 출력한다면 LEFT OUTER JOIN을 사용하면 되겠죠? 조인을 같이 사용하는 GROUP BY 문제였습니다.
'SQL 고득점 Kit > GROUP BY' 카테고리의 다른 글
[GROUP BY] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2024.09.20 |
---|---|
[GROUP BY] 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2024.09.19 |
[GROUP BY] 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2024.09.17 |
[GROUP BY] 저자 별 카테고리 별 매출액 집계하기 (2) | 2024.09.16 |
[GROUP BY] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (1) | 2024.09.15 |