본문 바로가기

Skill Sets/SQL

[SQL] 5월 식품들의 총매출 조회하기(프로그래머스/MySQL/Level 4)

SMALL

 

안녕하세요! 데코입니다!

 

오늘은 프로그래머스 코딩테스트 연습에 있는 "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)

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개의 테이블에서 원하는 데이터를 추출하고 결합하는 쿼리를 작성해 보았습니다!

설명이 어려운 부분 혹은 잘 이해가 안 가는 부분

그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!

빠르게 궁금증을 해결해 드릴게요!

공감과 댓글은 큰 힘이 됩니다!

오늘도 블로그 방문해 주시고

포스팅 읽어주셔서 감사합니다!

 

 

 

LIST