본문 바로가기
문제풀이/SQL(My sql)

[문제풀이] 카테고리 별 도서 판매량 집계

by kime2 2024. 1. 4.
출처

문제

2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 카테고리명을 기준으로 오름차순 정렬해주세요.

 

문제에 대한 해석

문제의 목표는 2022년 1월의 카테고리 별 총 판매량을 구하는 것입니다.

 

 

풀이(MYSQL)

-- MYSQL
select b.category, sum(bs.sales) as TOTAL_SALES
from book b join book_sales bs on b.book_id = bs.book_id
year(bs.sales_date) = 2022 and where month(bs.sales_date) =1 
group by b.category
order by b.category

 

작동순서

💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환

  1. FROM 절과 JOIN 절 : 책에 대한 정보 book테이블과 책판매에 대한 정보 book_sales을 book_id 를 기준으로 조인하여 책판매에 대한 정보와 해당 책에대한 정보를 볼 수 있도록 합니다.
  2. WHERE 절: year함수와 month함수를 통해 판매일자가 2022년이고 1월달인 책 판매정보만 필터링 합니다.
  3. GROUP BY 절: 카테고리에 따라 그룹화합니다. 이 단계는 카테고리별로 판매데이터를 모으는 과정입니다.
  4. SELECT 절: 그룹화된 데이터에 대해 카테고리와 카테고리별 총 판매액sum(bs.sales)을 계산합니다.
  5. ORDER BY절: 카테고리의 오름순으로 정렬합니다.
  6. 결과반환: 마지막으로 각 카테고리와 카테고리별 총 판매액이 담긴 결과가 반환됩니다.

 

다른사람 풀이

WITH TEMP AS (
SELECT BOOKID,SALES
, DATEFORMAT(SALESDATE, '%Y-%m') AS SALESDATE
FROM BOOKSALES
WHERE DATEFORMAT(SALESDATE, '%Y-%m') = "2022-01"
)
SELECT A.CATEGORY, SUM(B.SALES) AS TOTALSALES
FROM BOOK A
INNER JOIN TEMP B ON A.BOOKID = B.BOOKID
GROUP BY A.CATEGORY
ORDER BY 1

배운점

  1. 행이 적은 테이블과 행이 많은 테이블을 inner join했을때 조인한 기준별로 행이 많은 데이터에 행이 적인 데이터가 중복으로 입력된다-> 7개의 행이 있는 책정보 테이블과 200개가 넘는 책판매 테이블을 inner join 시에 book_id를 기준으로 책판매 행에 7개의 책 정보가 중복적으로 입력된다(단, book_id도 7개종류)

2. month(date)는 해당 날짜가 몇 월인지 알려준다. year(date)도 해당 날짜가 몇 년인지 알려준다.  이는 WHERE DATEFORMAT(SALESDATE, '%Y-%m') = "2022-01"로노 나타낼 수 있ㄷ다