다음은 식품공장의 주문정보를 담은 FOOD_ORDER
테이블입니다. 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_ORDER
테이블에서 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요. 출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문 ID를 기준으로 오름차순 정렬해주세요.
FOOD_ORDER
테이블이 다음과 같을 때
ORDER_ID | PRODUCT_ID | AMOUNT | PRODUCE_DATE | IN_DATE | OUT_DATE | FACTORY_ID | WAREHOUSE_ID |
---|---|---|---|---|---|---|---|
OD00000051 | P0002 | 4000 | 2022-04-01 | 2022-04-21 | 2022-04-21 | FT19970003 | WH0005 |
OD00000052 | P0003 | 2500 | 2022-04-10 | 2022-04-27 | 2022-04-27 | FT19970003 | WH0006 |
OD00000053 | P0005 | 6200 | 2022-04-15 | 2022-04-30 | 2022-05-01 | FT19940003 | WH0003 |
OD00000054 | P0006 | 1000 | 2022-04-21 | 2022-04-30 | NULL | FT19940003 | WH0009 |
OD00000055 | P0008 | 1500 | 2022-04-25 | 2022-05-11 | 2022-05-11 | FT19980003 | WH0009 |
SQL을 실행하면 다음과 같이 출력되어야 합니다.
ORDER_ID | PRODUCT_ID | OUT_DATE | 출고여부 |
---|---|---|---|
OD00000051 | P0002 | 2022-04-21 | 출고완료 |
OD00000052 | P0003 | 2022-04-27 | 출고완료 |
OD00000053 | P0005 | 2022-05-01 | 출고완료 |
OD00000054 | P0006 | 출고미정 | |
OD00000055 | P0008 | 2022-05-11 | 출고대기 |
# 식품공장의 주문정보를 담은 FOOD_ORDER
# 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문(주문 ID를 기준으로 오름차순 정렬)
# CASE, DATE_FORMAT 사용
SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE, '%Y-%m-%d') AS OUT_DATE,
CASE
WHEN (MONTH(OUT_DATE) = 5 AND DAY(OUT_DATE) = 1) OR (MONTH(OUT_DATE) < 5) THEN '출고완료'
WHEN (MONTH(OUT_DATE) = 5 AND DAY(OUT_DATE) > 1) OR (MONTH(OUT_DATE) > 5) THEN '출고대기'
ELSE '출고미정'
END AS 출고여부
FROM FOOD_ORDER
ORDER BY ORDER_ID
DATE_FORMAT()
,IF
,CASE
같은 함수 사용법을 잘 이해하고 사용할 수 있어야 한다. 특히 날짜 변환하는 것과 조건문은 순간적으로 어떤 형식으로 써야하는 지 자꾸 까먹는다. 계속 사용하면서 기억하기!
가장 간단한 조건문으로 조건이 참일 때와 거짓일 때 반환할 값을 지정할 수 있다.
IF
함수SELECT IF(조건식, 참일 때의 값, 거짓일 때의 값);
SELECT IF(age >= 18, 'adult', 'minor') AS age_group FROM users;
여러 조건을 넣어야 할 때 사용하며, 조건에 따라 다른 값을 반환한다.
CASE
문CASE WHEN 조건1 THEN 결과1 WHEN 조건2 THEN 결과2 ... ELSE 기본결과 END
SELECT user_id, CASE WHEN age < 18 THEN 'minor' WHEN age >= 18 AND age < 65 THEN 'adult' ELSE 'senior' END AS age_group FROM users;
첫 번째 인수가 NULL일 경우에 두 번째 인수를 반환한다.
IFNULL
함수SELECT IFNULL(column_name, 대체값) FROM table_name;
SELECT IFNULL(phone_number, 'N/A') AS phone_number FROM users;
DATE_FORMAT
함수%Y: 4자리 연도 (예: 2024) %y: 2자리 연도 (예: 24) %m: 2자리 월 (예: 05) %c: 1자리 또는 2자리 월 (예: 5) %d: 2자리 일 (예: 21) %e: 1자리 또는 2자리 일 (예: 21) %H: 2자리 시간 (24시간제, 예: 15) %h: 2자리 시간 (12시간제, 예: 03) %i: 2자리 분 (예: 04) %s: 2자리 초 (예: 59) %p: AM 또는 PM
DATE_FORMAT(date, format)
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS formatted_date; # 결과: 2024-05-21 SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS formatted_date; # 결과: 2024-05-21