KDT 실무형 스프링 백엔드 엔지니어 양성과정 6기 | SQL CODEKATA
🍽 조건별로 분류하여 주문상태 출력하기
🏷 관련 주제 : 주제1 주제2
문제 설명
다음은 식품공장의 주문정보를 담은 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 | 출고대기 |
✔ (Oracle) Solution with TO_CHAR, TO_DATE, CASE WHEN
SELECT ORDER_ID
, PRODUCT_ID
, TO_CHAR(OUT_DATE, 'YYYY-MM-DD') OUT_DATE
, CASE WHEN OUT_DATE - TO_DATE('2022-05-01', 'YYYY-MM-DD') <= 0 THEN '출고완료'
WHEN OUT_DATE IS NULL THEN '출고미정'
ELSE '출고대기' END "출고여부"
FROM FOOD_ORDER
ORDER BY ORDER_ID;
실행 결과
✔ (MySQL) Solution with DATE_FORMAT, CASE WHEN
SELECT ORDER_ID
, PRODUCT_ID
, DATE_FORMAT(OUT_DATE, '%Y-%m-%d') OUT_DATE
, CASE WHEN OUT_DATE <= '2022-05-01' THEN '출고완료'
WHEN OUT_DATE IS NULL THEN '출고미정'
ELSE '출고대기' END "출고여부"
FROM FOOD_ORDER
ORDER BY ORDER_ID;
실행 결과
💥 오늘 만난 문제 & 나의 시도 💦 & 해결 방법 👍
📌 오늘 만난 문제 : FOOD_ORDER 테이블에서 5월 1일을 기준으로 주문 ID, 제품 ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요.
출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고,
결과는 주문 ID를 기준으로 오름차순 정렬해주세요.
1. FOOD_ORDER테이블에서 주문 ID, 제품 ID, 출고일자를 조회하자.
출고일자가 예시의 날짜 형식과 같은 형식으로 출력되도록 (MySQL)DATE_FORMAT 또는 (Oracle)TO_CHAR를 이용하자.
별칭도 "OUT_DATE"로 주자.
MySQL Query
SELECT ORDER_ID , PRODUCT_ID , DATE_FORMAT(OUT_DATE, '%Y-%m-%d') OUT_DATE FROM FOOD_ORDER;실행 결과
Oracle Query
SELECT ORDER_ID , PRODUCT_ID , TO_CHAR(OUT_DATE, 'YYYY-MM-DD') OUT_DATE FROM FOOD_ORDER;실행 결과
2. 2022년 5월 1일을 기준으로 출고일자로 출고여부칼럼을 조회하자.
CASE WHEN 표현식을 사용하자.
MySQL Query
그냥 비교 연산자로 날짜 비교가 가능
SELECT ORDER_ID , PRODUCT_ID , DATE_FORMAT(OUT_DATE, '%Y-%m-%d') OUT_DATE , CASE WHEN OUT_DATE <= '2022-05-01' THEN '출고완료' WHEN OUT_DATE IS NULL THEN '출고미정' ELSE '출고대기' END "출고여부" FROM FOOD_ORDER;실행 결과
Oracle Query
그냥 비교연산자로 날짜 비교가 안되어서
2022-05-01을 TO_DATE()함수를 통해 날짜 형식으로 바꿔주고
두 날짜의 차로 두 날짜 사이의 기간을 구해 날짜 비교를 함.
SELECT ORDER_ID , PRODUCT_ID , TO_CHAR(OUT_DATE, 'YYYY-MM-DD') OUT_DATE , CASE WHEN OUT_DATE - TO_DATE('2022-05-01', 'YYYY-MM-DD') <= 0 THEN '출고완료' WHEN OUT_DATE IS NULL THEN '출고미정' ELSE '출고대기' END "출고여부" FROM FOOD_ORDER;실행 결과
3. 주문 ID로 정렬하기
MySQL Query
SELECT ORDER_ID , PRODUCT_ID , DATE_FORMAT(OUT_DATE, '%Y-%m-%d') OUT_DATE , CASE WHEN OUT_DATE <= '2022-05-01' THEN '출고완료' WHEN OUT_DATE IS NULL THEN '출고미정' ELSE '출고대기' END "출고여부" FROM FOOD_ORDER ORDER BY ORDER_ID;실행 결과
Oracle Query
SELECT ORDER_ID , PRODUCT_ID , TO_CHAR(OUT_DATE, 'YYYY-MM-DD') OUT_DATE , CASE WHEN OUT_DATE - TO_DATE('2022-05-01', 'YYYY-MM-DD') <= 0 THEN '출고완료' WHEN OUT_DATE IS NULL THEN '출고미정' ELSE '출고대기' END "출고여부" FROM FOOD_ORDER ORDER BY ORDER_ID;실행 결과
💬 무엇을 새롭게 알았는지
MySQL과 Oracle에서 날짜 비교하는 방법이 다르다는 것을 알게되었다.
- MySQL : 그냥 비교 연산자로 비교 가능
- Oracle : TO_DATE()를 통해 두 날짜를 날짜형식으로 변환 후, 서로 빼서 비교