SQL/MY SQL 문제 풀이(프로그래머스)

[MYSQL] PROGRAMMERS_저자 별 카테고리 별 매출액 집계하기

SQL공부 2024. 2. 23. 22:48
반응형

SELECT b.AUTHOR_ID, AUTHOR_NAME, CATEGORY, SUM(SALES*PRICE)TOTAL_SALES
FROM BOOK as b,  AUTHOR as a, BOOK_SALES as s
WHERE b.AUTHOR_ID = a.AUTHOR_ID
AND b.BOOK_ID = s.BOOK_ID
AND SALES_DATE like "2022-01%"
GROUP BY 1,3
ORDER BY 1,3 desc

문제

2022년 1월의 도서 판매 데이터를 기준으로 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 을 구하여, 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 리스트를 출력하는 SQL문을 작성
결과는 저자 ID를 오름차순으로, 저자 ID가 같다면 카테고리를 내림차순 정렬

 

 함정이 있는 문제입니다. 풀면서 보겠습니다.

먼저 3개의 테이블이 있습니다. 

 

각각의 테이블을 공통된 값을 가지는 컬럼을 통해 JOIN을 해줍니다. FROM 절에 컬럼명을 쓸 경우에는 순서가 정해진 바없이 아무렇게나 쓰셔도 무방합니다.

 

 다음으로 2022년 1월의 도서 판매 데이터 기준을 필터링 해줘야 하는데 이는 SALES_DATE에 값이 있습니다. 거기서 2022년 1월 데이터를 뽑아 오는데 방법은 DATE_FORMAT을 쓰거나 YEAR, MONTH 등을 써서 하든 상관없습니다. 여기서는 LIKE 2022-01% 를 사용하여 해당 값을 필터링 해줍니다.

 

 그다음으로는 GROUP 구문입니다. 저자 별, 카테고리 별 매출액을 요청하였으므로 저자와, 카테고리 기준으로 GROUP BY를 진행 해 줍니다.

 

 이제 혼돈이 올 수 있는 부분입니다. SUM(SALES)*PRICE를 하는 경우입니다 SUM(PRICE*SALES)를 해야 정답이지만 전자와 같이 SALES만 따로 빼고 PRICE를 외부로 뺄경우 문제가 발생합니다. SUM의 괄호 안에 있는 함수는 GROUP BY가 되면서 뭉쳐지는 값들을 합해줍니다. 괄호 외부의 값은 해당하지 않구요. 그래서 만약 PRICE가 밖에 있다면 현재 GROUP BY는 CATEGORY를 기준으로 되어있는데 다양한 BOOK ID별 PRICE들은 무시된채 특정 ID의 판매가격으로 바뀌게 됩니다. 따라서 오류가 발생합니다.

 그렇기 때문에 PRICE와 SALES를 함께 묶어서 계산 해 준뒤 SUM을 해주어야 합니다.

 

 그 다음은 자연스럽게 정렬을 해준뒤 마무리 하시면 됩니다.

반응형