문제 설명
다음은 식품의 정보를 담은 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_OL000010 | 식용유 | 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 | WH0032 |
OD00000058 | P0017 | 1200 | 2022-05-19 | 2022-05-28 | 2022-05-28 | FT20070002 | WH0032 |
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 |
코드
SELECT P.PRODUCT_ID,
P.PRODUCT_NAME,
SUM(P.PRICE * O.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT P
INNER JOIN FOOD_ORDER O
ON P.PRODUCT_ID = O.PRODUCT_ID
WHERE O.PRODUCE_DATE >= '2022-05-01' AND O.PRODUCE_DATE < '2022-06-01'
GROUP BY 1
ORDER BY 3 DESC, 1 ASC;
SELECT ~ FROM 절
FOOD_PRODUCT 테이블의 PRODUCT_ID, PRODUCT_NAME과 SUM 함수를 활용한 TOTAL_SALES 컬럼을 조회한다.
TOTAL_SALES는 FOOD_PRODUCT의 PRICE와 FOOD_ORDER 테이블의 AMOUNT를 곱하여 그룹화된 ID의 값들을 합하여 얻을 수 있다.
JOIN ON 절
FOOD_PRODUCT 테이블(P)과 FOOD_ORDER 테이블(O)을 INNER JOIN 한다. 조인 조건으로 P 테이블의 PRODUCT_ID와 O 테이블의 PRODUCT_ID가 같은 행들을 조인한다.
WHERE 절
생산일자가 2022년 5월인 식품들을 조회해야 하므로 O.PRODUCE_DATE가 2022-05-01 이상이고 2022-06-01 미만인 데이터를 조회한다.
GROUP BY
P.PRODUCT_ID를 기준으로 그룹화한다.
ORDER BY 절
TOTAL_SALES를 기준으로 내림차순 정렬하고, TOTAL_SALES가 같으면 P.PRODUCT_ID를 기준으로 오름차순 정렬한다.
'코딩 테스트(Coding Test) > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 년, 월, 성별 별 상품 구매 회원 수 구하기 - MySQL (0) | 2023.06.19 |
---|---|
[프로그래머스] 서울에 위치한 식당 목록 출력하기 - MySQL (0) | 2023.06.18 |
[프로그래머스] 식품분류별 가장 비싼 식품의 정보 조회하기 - MySQL (0) | 2023.06.16 |
[프로그래머스] 보호소에서 중성화한 동물 - MySQL (0) | 2023.06.15 |
[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 - MySQL (0) | 2023.06.14 |