[MYSQL] 5월 매출 총매출 조회 - 서브 쿼리, GROUP BY
문제
https://school.programmers.co.kr/learn/courses/30/lessons/131117#qna
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 요구사항
1. 두 테이블에서 생산일자가 2022년 5월인 식품들의 식품id, 식품 이름, 총매출 조회
2. 총매출 기준 내림차순, 식품id 기준 오름차순
핵심 능력
1. 생산일자 2022년 5월 -> where절에 date_format(x, "%Y-%m") = "2022-05"
2. 총매출 구하기 -> join, sub query
나의 답 (오답)
SELECT O.PRODUCT_ID, F.PRODUCT_NAME, O.AMOUNT * F.PRICE AS TOTAL_SALES
FROM FOOD_PRODUCT AS F
JOIN FOOD_ORDER AS O
USING(PRODUCT_ID)
ORDER BY TOTAL_SALES DESC, O.PRODUCT_ID
GROUP BY TOTAL_SALES
나처럼 쓰게 되면 total_sales에 있는 값들 중에 동일한 제품이 집계가 2개(1000개, 1500개)가 되는데 그중 가장 위에 있는 애(1000개)만 나오고 나머지는 삭제되어서 총매출이라고 하기에는 문제가 있었다. (원래는 2개(1000개, 1500개)가 1개(2500개)로 집계되어야 함)
인상적인 답
SELECT O.PRODUCT_ID, F.PRODUCT_NAME, O.AMOUNT * F.PRICE AS TOTAL_SALES
FROM FOOD_PRODUCT AS F
JOIN (
SELECT PRODUCT_ID, SUM(AMOUNT) AS AMOUNT
FROM FOOD_ORDER
WHERE DATE_FORMAT(PRODUCE_DATE, "%Y-%m") = "2022-05"
GROUP BY PRODUCT_ID) O
USING(PRODUCT_ID)
ORDER BY TOTAL_SALES DESC, O.PRODUCT_ID
위와 같은 문제를 해결하기 위해,
두 테이블 끼리 조인하기 전에 우선 FOOD_ORDER에서 22년 5월에 해당하면서 물건의 총합 SUM(AMOUNT)를 AMOUNT라는 변수로 갖는 테이블 O를 생성한다.
그러고 나서 FOOD_PRODUCT as F와 조인하면 된다.
총매출은 F의 price와 O의 amount를 곱한 값이다. 아주 잘 나온다. ㅎㅎ
오늘은 총매출을 구할때 우선 총계를 서브쿼리를 통해 정리하고 난 후 총계와 가격을 곱함으로써 총매출을 구하는 방법을 알아보았다.