해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.
해당 글에서는 집계함수와 GROUP BY를 이용하여 푸는 문제로 초보자가 하기에는 보통 정도의 난이도를 가지고 있는 것 같습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬해주세요.
해당 문제에서는 테이블을 잘 확인 해야 합니다. 왜냐하면 해당 테이블에서 저자와 카테고리가 같지만 BOOK ID가 다른 경우가 있기 때문입니다. (BOOK_ID가 다르면 그것은 다른 책으로 가격도 다르게 된다.)
원래 12000원과 9000원이 있어야 하는데 GROUP BY로 인해 테이블이 합쳐진 것을 볼 수 있습니다.
하지만, 그룹 내에 BOOK_ID와 PRICE는 따로 존재 합니다. (아래 이미지 참고)
SELECT a.AUTHOR_NAME,
b.CATEGORY,
GROUP_CONCAT(bs.BOOK_ID) AS BOOK_IDS,
GROUP_CONCAT(b.PRICE) AS PRICES
FROM BOOK b
JOIN AUTHOR a ON b.AUTHOR_ID = a.AUTHOR_ID
JOIN BOOK_SALES bs ON bs.BOOK_ID = b.BOOK_ID
GROUP BY b.AUTHOR_ID, a.AUTHOR_NAME, b.CATEGORY;
이를 생각하지 않고 SUM(SALES) * PRICE를 하게 되면 먼저 수량을 더하고 PRICE는 특정 하나의 값만 곱해지는 것입니다.
이 경우를 생각하지 않고 집계 함수를 사용하시면 계속 틀리게 될 것입니다.
1. 모든 테이블 JOIN 해주기
SELECT *
FROM BOOK b
JOIN
AUTHOR a ON b.AUTHOR_ID = a.AUTHOR_ID
JOIN
BOOK_SALES bs ON bs.BOOK_ID = b.BOOK_ID
WHERE DATE_FORMAT(bs.SALES_DATE, '2022-01-%d') = DATE_FORMAT(bs.SALES_DATE, '%Y-%m-%d')
이렇게 3개의 테이블을 JOIN을 통해 합쳐 주고 DATE_FORMAT을 통해 2022년 1월의 값들만 가져와 주었습니다.
2. GROUP BY를 통해 값들 묶어주기
SELECT *
FROM BOOK b
JOIN
AUTHOR a ON b.AUTHOR_ID = a.AUTHOR_ID
JOIN
BOOK_SALES bs ON bs.BOOK_ID = b.BOOK_ID
WHERE DATE_FORMAT(bs.SALES_DATE, '2022-01-%d') = DATE_FORMAT(bs.SALES_DATE, '%Y-%m-%d')
GROUP BY b.AUTHOR_ID, a.AUTHOR_NAME, b.CATEGORY
우선 3개의 값을 묶어준 이유는 문제에서 저자별, 카테고리 별로 묶어서 계산하라했기 때문입니다.
저자를 의미하는(ID, NAME) 두 개의 컬럼을 넣어 주었으나 혹시나 모를 동명이인 때문에 ID도 추가로 넣어 주었습니다.
(ID만 넣어도 될 것 같긴 하지만요ㅎㅎ)
3. SELECT 절에 문제에서 요구하는 값들만 추출하기
SELECT b.AUTHOR_ID
, a.AUTHOR_NAME
, b.CATEGORY
, SUM(bs.SALES * b.PRICE) AS TOTAL_SALES
FROM BOOK b
JOIN
AUTHOR a ON b.AUTHOR_ID = a.AUTHOR_ID
JOIN
BOOK_SALES bs ON bs.BOOK_ID = b.BOOK_ID
WHERE DATE_FORMAT(bs.SALES_DATE, '2022-01-%d') = DATE_FORMAT(bs.SALES_DATE, '%Y-%m-%d')
GROUP BY b.AUTHOR_ID, a.AUTHOR_NAME, b.CATEGORY
ORDER BY b.AUTHOR_ID ASC, b.CATEGORY DESC
해당 쿼리에서 중요한 점은 집계함수 사용 방법입니다.
SUM(bs.SALES * b.PRICE) 이렇게 하여 각 책의 PRICE 마다의 SALES(판매 수량)합을 곱해주는 방법을 사용해주었습니다.(각 행의 값들을 곱하고 더하고를 반복합니다.)
위의 그룹 내 분포 이미지를 보시면서 생각하면 더 편할 것입니다.
마지막으로 문제 조건에 맞는 정렬을 넣어주면 해당 코드는 정답이 됩니다!!
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.
'Data Analyst > SQL' 카테고리의 다른 글
[SQL] Programmers 문제 풀기(업그레이드 할 수 없는 아이템 구하기) (0) | 2024.11.04 |
---|---|
[SQL] Programmers 문제 풀기(연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기) (0) | 2024.11.01 |
[SQL] Programmers 문제 풀기(즐겨찾기가 가장 많은 식당 정보 출력하기) (0) | 2024.10.30 |
[SQL] Programmers 문제 풀기 (자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기) (0) | 2024.10.30 |
[SQL] Programmers 문제 풀기 (대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기) (0) | 2024.10.29 |