[SQL] 5월 식품들의 총매출 조회하기(JOIN)✅

Jaewon Lim·2024년 12월 28일

📝 문제 설명

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

Column NameTypeNullable
PRODUCT_IDVARCHAR(10)FALSE
PRODUCT_NAMEVARCHAR(50)FALSE
PRODUCT_CDVARCHAR(10)TRUE
CATEGORYVARCHAR(10)TRUE
PRICENUMBERTRUE

FOOD_ORDER 테이블은 다음과 같으며 ORDER_ID, PRODUCT_ID, AMOUNT, PRODUCE_DATE, IN_DATE, OUT_DATE, FACTORY_ID, WAREHOUSE_ID는 각각 주문 ID, 제품 ID, 주문량, 생산일자, 입고일자, 출고일자, 공장 ID, 창고 ID를 의미합니다.

Column NameTypeNullable
ORDER_IDVARCHAR(10)FALSE
PRODUCT_IDVARCHAR(5)FALSE
AMOUNTNUMBERFALSE
PRODUCE_DATEDATETRUE
IN_DATEDATETRUE
OUT_DATEDATETRUE
FACTORY_IDVARCHAR(10)FALSE
WAREHOUSE_IDVARCHAR(10)FALSE

❓ 문제

FOOD_PRODUCT와 FOOD_ORDER 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.

📖 예시

FOOD_PRODUCT 테이블이 다음과 같고

PRODUCT_IDPRODUCT_NAMEPRODUCT_CDCATEGORYPRICE
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_IDPRODUCT_IDAMOUNTPRODUCE_DATEIN_DATEOUT_DATEFACTORY_IDWAREHOUSE_ID
OD00000056P001210002022-04-042022-04-212022-04-25FT19980002WH0032
OD00000057P001425002022-04-142022-04-272022-05-01FT19980002WH0033
OD00000058P001712002022-05-192022-05-282022-05-28FT20070002WH0033
OD00000059P001710002022-05-242022-05-302022-05-30FT20070002WH0038
OD00000060P001920002022-05-292022-06-082022-06-08FT20070002WH0035

SQL을 실행하면 다음과 같이 출력되어야 합니다.

PRODUCT_IDPRODUCT_NAMETOTAL_SALES
P0017맛있는들기름17380000
P0019맛있는카놀라유10200000

💻 코드

내코드

SELECT 
    P.PRODUCT_ID
    ,P.PRODUCT_NAME
    , SUM(O.AMOUNT) * P.PRICE AS TOTAL_SALES   
FROM FOOD_PRODUCT P 
    LEFT JOIN FOOD_ORDER O 
    ON P.PRODUCT_ID = O.PRODUCT_ID
WHERE O.PRODUCE_DATE like "2022-05%"
GROUP BY P.PRODUCT_ID 
ORDER BY TOTAL_SALES DESC, P.PRODUCT_ID

정답코드

SELECT
    O.PRODUCT_ID,
    P.PRODUCT_NAME,
    P.PRICE * SUM(O.AMOUNT) AS TOTAL_SALES
FROM FOOD_ORDER O
LEFT JOIN FOOD_PRODUCT P ON O.PRODUCT_ID = P.PRODUCT_ID
WHERE O.PRODUCE_DATE LIKE '2022-05%'
GROUP BY O.PRODUCT_ID, P.PRODUCT_NAME
HAVING P.PRODUCT_NAME IS NOT NULL AND TOTAL_SALES IS NOT NULL
ORDER BY TOTAL_SALES DESC, P.PRODUCT_ID;

🔍 분석

  1. HAVING 절의 필요성
  • LEFT JOIN으로 인해 발생할 수 있는 NULL 값을 필터링 하기 위해 사용함
    • FOOD_ORDER <- FOOD_PRODUCT 붙이는 것이기 때문에 P.PRODUCT_NAME이 null일 수 있음
  • GROUP BY 이후 집계된 결과에서 NULL인 행을 제거하기 위해 필요함
    • HAVING절은 GROUP BY 이후에 실행되므로, TOTAL_SALES 값이 null인 경우를 제거할 수 있음

0개의 댓글