안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "5월 식품들의 총매출 조회하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/131117)
1. 문제 : 5월 식품들의 총매출 조회하기(Lv. 4)
2. 문제 설명
다음은 식품의 정보를 담은 FOOD_PRODUCT 테이블과
식품의 주문 정보를 담은 FOOD_ORDER 테이블입니다.
FOOD_PRODUCT 테이블은 다음과 같으며
PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE는
식품 ID, 식품 이름, 식품코드, 식품분류, 식품 가격을 의미합니다.
[ 테이블 구조('FOOD_PRODUCT') ]
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를 의미합니다.
[ 테이블 구조('FOOD_ORDER) ]
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 |
P0011 | 맛있는마조유 | 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 | PRODUCT_DATE | IN_DATE | OUT_DATE | FACTORY_ID | WAREHOUSE_ID |
OD00000056 | P0012 | 1200 | 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 |
OD0000060 | P0019 | 2000 | 2022-05-29 | 2022-06-08 | 2022-06-08 | FT20070002 | WH0035 |
SQL을 실행하면 다음과 같이 출력되어야 합니다.
[ 출력 결과 ]
PRODUCT_ID | PRODUCT_NAME | TOTAL_SALES |
P0017 | 맛있는들기름 | 17380000 |
P0019 | 맛있는카놀라유 | 10200000 |
3. 문제 풀이
-- 1안
SELECT A.PRODUCT_ID
, A.PRODUCT_NAME
, SUM(A.PRICE * B.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT A
LEFT
JOIN FOOD_ORDER B
ON A.PRODUCT_ID = B.PRODUCT_ID
WHERE 1=1
AND YEAR(B.PRODUCE_DATE) = 2022
AND MONTH(B.PRODUCE_DATE) = 5
GROUP
BY A.PRODUCT_ID
, A.PRODUCT_NAME
ORDER
BY TOTAL_SALES DESC
, PRODUCT_ID ASC
이번 문제는 총 1안 한 가지로 작성했습니다!
# 1안 풀이 설명
# [ 문제 접근 설명 ]
문제를 읽고 조건에 맞는 쿼리를 작성하기 위해서 다음과 같이 다섯 가지 단계로 진행했어요!
1. FOOD_PRODUCT 테이블과 FOOD_ORDER 테이블을 결합(JOIN)
2. FOOD_ORDER 테이블의 PRODUCE_DATE에서 2022년 5월 데이터 추출(WHERE)
3 PRODUCT_ID와 PRODUCT_NAME을 기준으로 그룹화(GROUP)
4. PRICE와 AMOUNT를 곱하여 TOTAL_SALES 컬럼 계산
5. 금액 기준 내림차순 정렬, PRODUCT_ID 기준 오름차순 정렬(ORDER BY)
# [ 1안 쿼리 작성 설명 ]
1 첫 번째 단계에서는 FOOD_PRODUCT 테이블과 FOOD_ORDER 테이블을 JOIN 해주었습니다!
두 테이블에서 공통적으로 PRODUCT_ID가 존재해서, 해당 컬럼으로 ON 조건에 넣어서 결합해주었어요!
SELECT *
FROM FOOD_PRODUCT A
LEFT
JOIN FOOD_ORDER B
ON A.PRODUCT_ID = B.PRODUCT_ID
2 두 번째 단계에서는 FOOD_ORDER 테이블에서 2022년 5월 데이터를 추출했습니다..
WHERE 조건에 YEAR() 함수를 통해 2022년
그리고 MONTH() 함수를 통해 5월 데이터만을 추출했습니다!
SELECT *
FROM FOOD_PRODUCT A
LEFT
JOIN FOOD_ORDER B
ON A.PRODUCT_ID = B.PRODUCT_ID
WHERE 1=1
AND YEAR(B.PRODUCE_DATE) = 2022
AND MONTH(B.PRODUCE_DATE) = 5
3 세 번째 단계에서는 PROUDUCT_ID와 PRODUCT_NAME별로 계산을 할 것이기 때문에
GROUP BY문을 이용해서 그룹화 시켜주었습니다.
SELECT A.PRODUCT_ID
, A.PRODUCT_NAME
FROM FOOD_PRODUCT A
LEFT
JOIN FOOD_ORDER B
ON A.PRODUCT_ID = B.PRODUCT_ID
WHERE 1=1
AND YEAR(B.PRODUCE_DATE) = 2022
AND MONTH(B.PRODUCE_DATE) = 5
GROUP
BY A.PRODUCT_ID
, A.PRODUCT_NAME
4 네 번째 단계에서는 가격(PRICE)과 수량(AMOUNT)을 곱한 값을 모두 합친 값을 산출하고
이를 TOTAL_SALES로 별칭을 붙여주었어요!
SELECT A.PRODUCT_ID
, A.PRODUCT_NAME
, SUM(A.PRICE * B.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT A
LEFT
JOIN FOOD_ORDER B
ON A.PRODUCT_ID = B.PRODUCT_ID
WHERE 1=1
AND YEAR(B.PRODUCE_DATE) = 2022
AND MONTH(B.PRODUCE_DATE) = 5
GROUP
BY A.PRODUCT_ID
, A.PRODUCT_NAME
5 마지막으로는 요구사항에 맞게 정렬했어요!
총매출(TOTAL_SALES) 기준 내림차순 정렬,
상품ID(PRODUCT_ID) 기준 오름차순 정렬했습니다!
SELECT A.PRODUCT_ID
, A.PRODUCT_NAME
, SUM(A.PRICE * B.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT A
LEFT
JOIN FOOD_ORDER B
ON A.PRODUCT_ID = B.PRODUCT_ID
WHERE 1=1
AND YEAR(B.PRODUCE_DATE) = 2022
AND MONTH(B.PRODUCE_DATE) = 5
GROUP
BY A.PRODUCT_ID
, A.PRODUCT_NAME
ORDER
BY TOTAL_SALES DESC
, PRODUCT_ID ASC
4. 데코의 문제 풀이 후기
이번 문제도 LEVEL 4인 문제였는데요!
다 다룬 유형이라서, 제가 블로그를 작성하면서도 너무 동일한 내용이 아닌가라는 생각이 들었습니다!
그래도 SQL 쿼리를 많이 접해보시지 않은 분들은
여러 가지 테이블을 이용해서 SQL 쿼리를 작성하는 것이 도움이 될 것 같아서 적어보았습니다!
이번 문제도 제가 따로 코멘트할 것은 없네요!
혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요!
이번 문제는 2개의 테이블에서 원하는 데이터를 추출하고 결합하는 쿼리를 작성해 보았습니다!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 식품분류별 가장 비싼 식품의 정보 조회하기(프로그래머스/MySQL/Level 4) (49) | 2024.04.06 |
---|---|
[SQL] 조건별로 분류하여 주문상태 출력하기(프로그래머스/MySQL/Level 3) (59) | 2024.02.03 |
[SQL] 그룹별 조건에 맞는 식당 목록 출력하기(프로그래머스/MySQL/Level 4) (76) | 2024.01.19 |
[SQL] 상품을 구매한 회원 비율 구하기(프로그래머스/MySQL/Level 5) (81) | 2023.12.01 |
[SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기(프로그래머스/MySQL/Level 3) (53) | 2023.11.19 |