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

Jaewon Lim·2025년 1월 15일

📝 문제 설명

다음은 식품의 정보를 담은 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맛있는들기름17,380,000
P0019맛있는카놀라유10,200,000

💻 코드

내코드

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
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. JOIN 시 비어있는 컬럼은 어떻게 처리해야할까?
  • 기존 내 코드 결과, 세 개의 PRODUCT_ID에서 결측값을 확인할 수 있다. 이런 경우 기존 저 아이디를 갖는 FOOR_PRODUCT 테이블에서 정보가 없다는 것이다. 그렇다면 없는 건 제외하고 결과값을 나타내려면 HAVING 절을 사용하자.
    업로드중..

HAVING P.PRODUCT_NAME IS NOT NULL AND TOTAL_SALES IS NOT NULL

0개의 댓글