5월 식품들의 총매출 조회하기
JOIN
5월 식품들의 총매출 조회하기
문제 설명
다음은 식품의 정보를 담은 FOOD_PRODUCT 테이블과 식품의 주문 정보를 담은 FOOD_ORDER 테이블입니다.
FOOD_PRODUCT 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
PRODUCT_ID | VARCHAR(10) | FALSE | 식품 ID |
PRODUCT_NAME | VARCHAR(50) | FALSE | 식품 이름 |
PRODUCT_CD | VARCHAR(10) | TRUE | 식품 코드 |
CATEGORY | VARCHAR(10) | TRUE | 식품 분류 |
PRICE | NUMBER | TRUE | 식품 가격 |
FOOD_ORDER 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
ORDER_ID | VARCHAR(10) | FALSE | 주문 ID |
PRODUCT_ID | VARCHAR(5) | FALSE | 제품 ID |
AMOUNT | NUMBER | FALSE | 주문량 |
PRODUCE_DATE | DATE | TRUE | 생산 일자 |
IN_DATE | DATE | TRUE | 입고 일자 |
OUT_DATE | DATE | TRUE | 출고 일자 |
FACTORY_ID | VARCHAR(10) | FALSE | 공장 ID |
WAREHOUSE_ID | VARCHAR(10) | FALSE | 창고 ID |
문제
FOOD_PRODUCT와 FOOD_ORDER 테이블에서 생산일자가 2022년 5월인 식품들의 식품 ID, 식품 이름, 총매출을 조회하는 SQL문을 작성해주세요. 이때 결과는 총매출을 기준으로 내림차순 정렬해주시고 총매출이 같다면 식품 ID를 기준으로 오름차순 정렬해주세요.
풀이 과정
- 조건 확인
- 생산일자가 2022년 5월인 제품을 필터링해야함
TO_CHAR(PRODUCE_DATE
, ‘YYYY-MM’) = ‘2022-05’ - 총 매출(
TOTAL_SALES
) = 주문량 * 가격 구하기
- 생산일자가 2022년 5월인 제품을 필터링해야함
- 테이블 결합 (JOIN)
- ANIMAL_OUTS 테이블 기준으로 INNSER JOIN 사용해야겠군
- LEFT JOIN 선택 이유: 주문 정보가 없는 제품은 결과에서 제외해야 하므로 INNER JOIN이 적합
- 총매출 계산
- SUM(
AMOUNT
*PRICE
)를 통해 총매출 계산
결과를 제품별로 집계하기 위해 GROUP BY를 사용
- SUM(
- 결과 정렬하기
- 정렬 기준에 따라 ORDER BY로 결과 정렬
- 총매출(
TOTAL_SALES
)을 기준 내림차순 정렬 - 총매출이 같다면
PRODUCT_ID
를 기준 오름차순 정렬
- 총매출(
- 정렬 기준에 따라 ORDER BY로 결과 정렬
- 최종 결과 출력
- 최종적으로 식품 ID(
PRODUCT_ID
), 식품 이름(PRODUCT_NAME
), 총매출(TOTAL_SALES
)만 출력
- 최종적으로 식품 ID(
- 교훈
- INNSER JOIN = JOIN (ON 컬럼명 을 기준값으로 동일한 ROW들만 출력됨)
- 프로젝트 했던 회사에서는 오라클에서 제공하는 전통적인 조인 방식으로 (+) 연산자를 사용해왔는데,
ANSI 표준이 아니며, 다른 DBMS에서는 지원하지 않기 때문에 방법을 바꿔보도록 하려고 한다. 익숙해지자.. + 줄맞춤도..
정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
FP.PRODUCT_ID,
FP.PRODUCT_NAME,
SUM(FO.AMOUNT * FP.PRICE) AS TOTAL_SALES
FROM
FOOD_PRODUCT FP
JOIN
FOOD_ORDER FO
ON
FP.PRODUCT_ID = FO.PRODUCT_ID
WHERE
TO_CHAR(FO.PRODUCE_DATE, 'YYYY-MM') = '2022-05'
GROUP BY
FP.PRODUCT_ID, FP.PRODUCT_NAME
ORDER BY
TOTAL_SALES DESC,
FP.PRODUCT_ID ASC;
Tip
- 생산일자가 2022년 5월인 제품 필터링
- TO_CHAR(
PRODUCE_DAT
E, ‘YYYY-MM’) = ‘2022-05’:PRODUCE_DATE
를 연도와 월로 변환하여 2022년 5월을 선택- 총매출 계산
- SUM(
FO.AMOUNT
*FP.PRICE
): 주문량(AMOUNT
)과 가격(PRICE
)을 곱하여 총매출을 계산- 특정 컬럼 값들의 총합을 구하는 데 SUM을 사용.
AMOUNT
와PRICE
를 곱한 값을 SUM으로 집계하면, 각 제품의 총매출 계산이 가능
SQL Dialect Used: Oracle
개념 확인
- BETWEEN 연산자
- 해당 범위 내의 데이터를 필터링
- WHERE
컬럼명
BETWEEN 500000 AND 1999999- GROUP 함수
- 특정 컬럼 값을 기준으로 데이터를 그룹화하여 집계 계산 수행
- SUM, AVG, COUNT, MAX, MIN, STDDEV, VARIANCE, GROUPING, MEDIAN 등
- INNER JOIN (=JOIN)
- 두 테이블 간의 공통된 키를 기준으로 데이터를 결합
- TO_CHAR 함수
- 날짜나 숫자 데이터를 원하는 형식으로 문자열로 변환
TO_CHAR(PRODUCE_DATE, ‘YYYY-MM’) → 날짜를 “YYYY-MM” 형식으로 변환
Useful link
This post is licensed under Park Juyoung by the author.