[알고리즘][X] 5월 식품들의 총매출 조회하기

2023. 9. 17. 13:34알고리즘 풀이/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

나의 풀이

- 2022-05라는 조건을 보지 못해 틀렸다. 이런 거 조심하자!

- 또 하나는 having으로 b.produce_date like를 했는데 b.produce_date가 없다고 나오는 것이었다. 왜 그런지 모르겠다.

- 그래서 group by 앞에 먼저 where로 거르고 난 뒤 해서 맞았다.

- having은 무조건 집계 함수가 들어가야 한다. 그래서 안되었다.

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 a.product_id order by total_sales desc, a.product_id

 

Reference


https://bamdule.tistory.com/220

 

[Mysql] group by와 having

1. group by란? group by는 특정 컬럼을 기준으로 그룹화 하는 명령어입니다. 그룹화를 하면 집계함수를 이용해서 통계데이터(평균, 합계 등)을 구할 수 있습니다. select 컬럼 from 테이블명 where 조건 gro

bamdule.tistory.com