본문 바로가기
Language/DB

[Programmers | SQL | String, Date 문제 풀이] 조건별로 분류하여 주문상태 출력하기 - Solution with CASE WHEN

by ㅇ달빛천사ㅇ 2024. 6. 12.
728x90

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()를 통해 두 날짜를 날짜형식으로 변환 후, 서로 빼서 비교

📚 References(참고 자료)

728x90


Top