본문 바로가기
SQL 문제 풀기/1. 프로그래머스 SQL : 2023.12.17~2024.2.29

<프로그래머스 51> 조건별로 분류하여 주문상태 출력하기(Lv.3)

by HYEHYE_SON 2024. 2. 5.
728x90

 

프로그래머스에서 제공하는 SQL문제 매일 풀기 챌린지


 

문제 설명

다음은 식품공장의 주문정보를 담은 FOOD_ORDER 테이블입니다. FOOD_ORDER 테이블은 다음과 같으며 ORDER_IDPRODUCT_IDAMOUNTPRODUCE_DATEIN_DATE,OUT_DATE,FACTORY_IDWAREHOUSE_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 출고대기

♥ 오라클 정답

select order_id, product_id, to_char(out_date, 'RRRR-MM-DD') out_date, 
    (case when out_date <= to_date('20220501', 'RRRRMMDD') then '출고완료'
    when out_date > to_date('20220501', 'RRRRMMDD') then '출고대기'
    else '출고미정' end ) 출고여부
    from food_order
    order by order_id asc;

오라클 해설해보기

# 1. SELECT 절

출력할 컬럼명들을 나열해주는데, 
OUT_DATE와 출고여부 컬럼은 가공이 필요하다. 

OUT_DATE 컬럼은 출력예시의 형식에 맞게 출력해줘야 하기 때문에
TO_CHAR 함수를 사용하여 DATA TYPE의 FORMAT을 지정해줘야한다.

 

 ▶   TO_CHAR([컬럼명], '변경할 데이터 형태')
   위의 함수를 사용해서 날짜형 데이터 형식을 → 문자형 데이터 형식으로 변환한다.

   * 표시한 형태 해석(오라클의 경우 대소문자 구분 없음)
   - RRRR/YYYY : Year 연도 4자리로 표기(ex. 2023, 2024)
   - MM : Month 월 2자리로 표기 (ex. 05, 07)
   - DD : Day 일 2자리로 표기 (ex. 01, 31)

띠라서 아래와 같이 형식을 변경해주고,
컬럼 별칭을 지정해주었다.

to_char(out_date, 'RRRR-MM-DD') out_date


출고여부 컬럼은 
여러 조건이 존재하고 각 조건에 해당할 때 출력해줘야할 값들이 다르다.
이럴 때 CASE WHEN 조건문을 사용할 수 있다.


 ▶   CASE WHEN 조건문

CASE WHEN [조건1] TEHN [조건1이 참일 때 출력할 값]
    WHEN [조건2] THEN [조건2가 참일 때 출력할 값]
    ELSE [조건1,조건2..등 모두 해당되지 않을 때 출력할 값]
    END


위의 문법을 적용하면 

조건1 = 출고일자가 5월 1일 이전, 그리고 5월 1일인 경우 '출고완료'

조건2 = 출고일자가 5월 2일 부터 그 이후인 경우 '출고대기'

둘 다 아닌 경우 = 출고일자가 정해지지 않은 경우 '출고미정'

으로 조건을 생성해줘야한다. 

(case when out_date <= to_date('20220501', 'RRRRMMDD') then '출고완료'
    when out_date > to_date('20220501', 'RRRRMMDD') then '출고대기'
    else '출고미정' end ) 출고여부

 

위와 같이 조건을 생성해주는데, 

날짜 비교를 하기 위해서 숫자인 20220501을 TO_DATE함수를 이용하여

DATA TYPE을 문자에서 날짜형식으로 변경해준다.

표시한 형태는 TO_CHAR와 같으므로 위에있는 설명을 참고하면 된다. 

 


   MySQL 정답

select order_id, product_id, date_format(out_date, '%Y-%m-%d') out_date, 
    (case when out_date <= str_to_date('20220501', '%Y%m%d') then '출고완료'
    when out_date > str_to_date('20220501', '%Y%m%d') then '출고대기'
    else '출고미정' end ) 출고여부
    from food_order
    order by order_id asc;

# 1. SELECT 절

출력할 컬럼명들을 나열해주는데, 
OUT_DATE와 출고여부 컬럼은 가공이 필요하다. 

OUT_DATE 컬럼은 출력예시의 형식에 맞게 출력해줘야 하기 때문에
DATE_FORMAT 함수를 사용하여 DATA TYPE의 FORMAT을 지정해줘야한다.

 

    DATE_FORMATE([컬럼명], '변경할 데이터 형태' ) 함수

   * 표시한 형태 해석(대소문자 구분 있음)
   - %Y : Year 연도를 4자리로 표기 (ex. 2023, 2024)
   - %m : Month 월을 2자리로 표기(ex. 05, 12)
   - %d : Day 일을 두 자리로 표기(ex. 04, 28)

* 참고
   - %c :Month 월을 한 자리로 표기(ex. 5, 12) 
   - %e :Day 일을 한자리로 표기(ex. 4, 28)


띠라서 아래와 같이 형식을 변경해주고,
컬럼 별칭을 지정해주었다.

date_format(out_date, '%Y-%m-%d') out_date


출고여부 컬럼은 
여러 조건이 존재하고 각 조건에 해당할 때 출력해줘야할 값들이 다르다.
이럴 때 CASE WHEN 조건문을 사용할 수 있다.

 ▶   CASE WHEN 조건문

CASE WHEN [조건1] TEHN [조건1이 참일 때 출력할 값]
    WHEN [조건2] THEN [조건2가 참일 때 출력할 값]
    ELSE [조건1,조건2..등 모두 해당되지 않을 때 출력할 값]
    END


위의 문법을 적용하면 

조건1 = 출고일자가 5월 1일 이전, 그리고 5월 1일인 경우 '출고완료'

조건2 = 출고일자가 5월 2일 부터 그 이후인 경우 '출고대기'

둘 다 아닌 경우 = 출고일자가 정해지지 않은 경우 '출고미정'

으로 조건을 생성해줘야한다. 

(case when out_date <= str_to_date('20220501', '%Y%m%d') then '출고완료'
    when out_date > str_to_date('20220501', '%Y%m%d') then '출고대기'
    else '출고미정' end ) 출고여부

 

위와 같이 조건을 생성해주는데, 

날짜 비교를 하기 위해서 숫자인 20220501을 SRT_TO_DATE 함수를 이용하여

DATA TYPE을 문자에서 날짜형식으로 변경해준다.

표시한 형태는 DATE_FORMAT과  같으므로 위에있는 설명을 참고하면 된다. 

 


결과 출력

((이하생략))

 

 

 

 

출처 : 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

반응형