[SQL][2] 5월 식품들의 총매출 조회하기

2023. 10. 19. 22:39알고리즘 풀이/SQL

문제 설명
다음은 식품의 정보를 담은 FOOD_PRODUCT 테이블과 식품의 주문 정보를 담은 FOOD_ORDER 테이블입니다. FOOD_PRODUCT 테이블은 다음과 같으며 PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE는 식품 ID, 식품 이름, 식품코드, 식품분류, 식품 가격을 의미합니다.

Column name	Type	Nullable
PRODUCT_ID	VARCHAR(10)	FALSE
PRODUCT_NAME	VARCHAR(50)	FALSE
PRODUCT_CD	VARCHAR(10)	TRUE
CATEGORY	VARCHAR(10)	TRUE
PRICE	NUMBER	TRUE
FOOD_ORDER 테이블은 다음과 같으며 ORDER_ID, PRODUCT_ID, AMOUNT, PRODUCE_DATE, IN_DATE, OUT_DATE, FACTORY_ID, WAREHOUSE_ID는 각각 주문 ID, 제품 ID, 주문량, 생산일자, 입고일자, 출고일자, 공장 ID, 창고 ID를 의미합니다.

Column name	Type	Nullable
ORDER_ID	VARCHAR(10)	FALSE
PRODUCT_ID	VARCHAR(5)	FALSE
AMOUNT	NUMBER	FALSE
PRODUCE_DATE	DATE	TRUE
IN_DATE	DATE	TRUE
OUT_DATE	DATE	TRUE
FACTORY_ID	VARCHAR(10)	FALSE
WAREHOUSE_ID	VARCHAR(10)	FALSE
문제
FOOD_PRODUCT와 FOOD_ORDER 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.

예시
FOOD_PRODUCT 테이블이 다음과 같고

PRODUCT_ID	PRODUCT_NAME	PRODUCT_CD	CATEGORY	PRICE
P0011	맛있는콩기름	CD_OL00001	식용유	4880
P0012	맛있는올리브유	CD_OL00002	식용유	7200
P0013	맛있는포도씨유	CD_OL00003	식용유	5950
P0014	맛있는마조유	CD_OL00004	식용유	8950
P0015	맛있는화조유	CD_OL00005	식용유	8800
P0016	맛있는참기름	CD_OL00006	식용유	7100
P0017	맛있는들기름	CD_OL00007	식용유	7900
P0018	맛있는고추기름	CD_OL00008	식용유	6100
P0019	맛있는카놀라유	CD_OL00009	식용유	5100
P0020	맛있는산초유	CD_OL00010	식용유	6500
FOOD_ORDER 테이블이 다음과 같을 때

ORDER_ID	PRODUCT_ID	AMOUNT	PRODUCE_DATE	IN_DATE	OUT_DATE	FACTORY_ID	WAREHOUSE_ID
OD00000056	P0012	1000	2022-04-04	2022-04-21	2022-04-25	FT19980002	WH0032
OD00000057	P0014	2500	2022-04-14	2022-04-27	2022-05-01	FT19980002	WH0033
OD00000058	P0017	1200	2022-05-19	2022-05-28	2022-05-28	FT20070002	WH0033
OD00000059	P0017	1000	2022-05-24	2022-05-30	2022-05-30	FT20070002	WH0038
OD00000060	P0019	2000	2022-05-29	2022-06-08	2022-06-08	FT20070002	WH0035
SQL을 실행하면 다음과 같이 출력되어야 합니다.

PRODUCT_ID	PRODUCT_NAME	TOTAL_SALES
P0017	맛있는들기름	17380000
P0019	맛있는카놀라유	10200000

나의 풀이

- group by와 join을 활용하는 문제

- group by할 때에도 product_id라고 컬럼 이름이 정해져있으므로 어느 테이블로부터 오는지 명시하지 않아도 된다.

- 근데 where 같은 경우는 b를 붙이지 않아도 되지만 어디서 온 건지를 확실히 해주기 위해서는 명시해주는게 좋다.

select a.product_id, a.product_name, sum(a.price * b.amount) as total_sales 
from food_product as a
inner join food_order as b on a.product_id = b.product_id
where b.produce_date like "2022-05%"
group by product_id
order by total_sales desc, product_id