안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "조건별로 분류하여 주문상태 출력하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/131113)
1. 문제 : 조건별로 분류하여 주문상태 출력하기(Lv. 3)
2. 문제 설명
다음은 식품공장의 주문정보를 담은 FOOD_ORDER 테이블입니다.
FOOD_ORDER 테이블은 다음과 같으며
ORDER_ID, PRODUCT_ID, AMOUNT, PRODUCE_DATE, IN_DATE, OUT_DATE, FACTORY_ID, WAREHOUSE_ID는
각각 주문 ID, 제품 ID, 주문양, 생산일자, 입고일자, 출고일자, 공장 ID, 창고 ID를 의미합니다.
[ 테이블 구조('FOOD_ORDER') ]
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 |
OD000051 | P0002 | 4000 | 2022-04-01 | 2022-04-21 | 2022-04-21 | FT19970003 | WH0005 |
OD000052 | P0003 | 2500 | 2022-04-10 | 2022-04-27 | 2022-04-27 | FT19970003 | WH0006 |
OD000053 | P0005 | 6200 | 2022-04-15 | 2022-04-30 | 2022-05-01 | FT19940003 | WH0003 |
OD000054 | P0006 | 1000 | 2022-04-21 | 2022-04-30 | NULL | FT19940003 | WH0009 |
OD000055 | P0008 | 1500 | 2022-04-25 | 2022-05-11 | 2022-05-11 | FT19980003 | WH0009 |
SQL을 실행하면 다음과 같이 출력되어야 합니다.
[ 출력 결과 ]
ORDER_ID | PRODUCT_ID | OUT_DATE | 출고여부 |
OD000051 | P0002 | 2022-04-21 | 출고완료 |
OD000052 | P0003 | 2022-04-27 | 출고완료 |
OD000053 | P0005 | 2022-05-01 | 출고완료 |
OD000054 | P0006 | 출고미정 | |
OD000055 | P0008 | 2022-05-11 | 출고대기 |
3. 문제 풀이
-- 1안
SELECT A.ORDER_ID
, A.PRODUCT_ID
, DATE_FORMAT(A.OUT_DATE, "%Y-%m-%d") AS OUT_DATE
, CASE WHEN A.OUT_DATE <= '2022-05-01' THEN "출고완료"
WHEN A.OUT_DATE > '2022-05-01' THEN "출고대기"
ELSE "출고미정" END AS 출고여부
FROM FOOD_ORDER A
ORDER
BY ORDER_ID ASC
-- 2안
SELECT A.ORDER_ID
, A.PRODUCT_ID
, DATE_FORMAT(A.OUT_DATE, "%Y-%m-%d") AS OUT_DATE
, CASE WHEN DATEDIFF('2022-05-01', A.OUT_DATE) >= 0 THEN '출고완료'
WHEN DATEDIFF('2022-05-01', A.OUT_DATE) < 0 THEN '출고대기'
ELSE "출고미정" END AS 출고여부
FROM FOOD_ORDER A
ORDER
BY ORDER_ID ASC
이번 문제는 오랜만에 2안, 두 가지 쿼리로 작성했습니다!
크게 다른 것은 없어서 두 가지 풀이를 동시에 설명할게요!
# 1안 & 2안 풀이 설명
# [ 문제 접근 설명 ]
문제를 읽고 조건에 맞는 쿼리를 작성하기 위해서 다음과 같이 세 가지 단계로 진행했어요!
1. FOOD_ORDER 테이블에서 날짜 포멧 적용(SELECT)
2. CASE문을 통해서 출고여부 컬럼 생성(SELECT/CASE WHEN)
3. 주문ID 기준 오름차순 정렬(ORDER BY)
# [ 1안 쿼리 작성 설명 ]
1 첫 번째 단계에서는 FOOD_ORDER 테이블에서 SELECT로 필요한 컬럼을 가져왔어요!
OUT_DATE 컬럼도 출력결과와 같이 '%Y-%m-%d' 형식으로 날짜 포멧을 적용해 주었습니다!
SELECT A.ORDER_ID
, A.PRODUCT_ID
, DATE_FORMAT(A.OUT_DATE, "%Y-%m-%d") AS OUT_DATE
FROM FOOD_ORDER A
2 두 번째 단계에서는 CASE WHEN을 이용해서 출고완료 / 출고대기 / 출고미정 값을 가지는
출고여부 변수를 생성해 주었어요!
1안과 2안은 CASE WHEN에서 차이가 나는데요!
1안은 OUT_DATE를 '2022-05-01'값과 직접적으로 비교해줘서 출고여부 변수의 값을 지정해 주었습니다.
2안은 DATEDIFF() 함수를 통해 OUT_DATE와 '2022-05-01'값과의 차이를 산출하고
이를 통해 출고여부 변수의 값을 지정해 주었습니다!
다르게 표현했지만 동일한 내용입니다!
-- 1안
SELECT A.ORDER_ID
, A.PRODUCT_ID
, DATE_FORMAT(A.OUT_DATE, "%Y-%m-%d") AS OUT_DATE
, CASE WHEN A.OUT_DATE <= '2022-05-01' THEN "출고완료"
WHEN A.OUT_DATE > '2022-05-01' THEN "출고대기"
ELSE "출고미정" END AS 출고여부
FROM FOOD_ORDER A
-- 2안
SELECT A.ORDER_ID
, A.PRODUCT_ID
, DATE_FORMAT(A.OUT_DATE, "%Y-%m-%d") AS OUT_DATE
, CASE WHEN DATEDIFF('2022-05-01', A.OUT_DATE) >= 0 THEN '출고완료'
WHEN DATEDIFF('2022-05-01', A.OUT_DATE) < 0 THEN '출고대기'
ELSE "출고미정" END AS 출고여부
FROM FOOD_ORDER A
3 마지막으로는 요구사항에 맞게 정렬했어요!
주문ID(ORDER_ID) 기준으로 오름차순 정렬을 해주었습니다!
-- 1안
SELECT A.ORDER_ID
, A.PRODUCT_ID
, DATE_FORMAT(A.OUT_DATE, "% Y-%m-%d") AS OUT_DATE
, CASE WHEN A.OUT_DATE <= '2022-05-01' THEN "출고완료"
WHEN A.OUT_DATE > '2022-05-01' THEN "출고대기"
ELSE "출고미정" END AS 출고여부
FROM FOOD_ORDER A
ORDER
BY ORDER_ID ASC
-- 2안
SELECT A.ORDER_ID
, A.PRODUCT_ID
, DATE_FORMAT(A.OUT_DATE, "%Y-%m-%d") AS OUT_DATE
, CASE WHEN DATEDIFF('2022-05-01', A.OUT_DATE) >= 0 THEN '출고완료'
WHEN DATEDIFF('2022-05-01', A.OUT_DATE) < 0 THEN '출고대기'
ELSE "출고미정" END AS 출고여부
FROM FOOD_ORDER A
ORDER
BY ORDER_ID ASC
4. 데코의 문제 풀이 후기
이번 문제는 LEVEL 3인 문제였는데요!
CASE문을 이용해서 값을 변환해 준 것을 제외하면, 기존에 다 다룬 유형입니다!
오히려 WHERE문과 JOIN도 없어서 더 쉽게 작성을 한 것 같아요!
오늘도 업무 하면서 CASE문을 통해서 값을 생성했었는데, 실제 업무에서도 CASE문은 많이 이용하니까!
SQL 쿼리를 처음 접하는 분들에게는 도움이 될 것 같네요!
이번 문제도 제가 따로 코멘트할 것은 없네요!
혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요!
이번 문제는 CASE문을 통해 값을 변환하여 새로운 변수를 만드는 쿼리를 작성해 보았습니다!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 물고기 종류 별 잡은 수 구하기(프로그래머스/MySQL/Level 2) (33) | 2024.05.26 |
---|---|
[SQL] 식품분류별 가장 비싼 식품의 정보 조회하기(프로그래머스/MySQL/Level 4) (49) | 2024.04.06 |
[SQL] 5월 식품들의 총매출 조회하기(프로그래머스/MySQL/Level 4) (51) | 2024.01.29 |
[SQL] 그룹별 조건에 맞는 식당 목록 출력하기(프로그래머스/MySQL/Level 4) (76) | 2024.01.19 |
[SQL] 상품을 구매한 회원 비율 구하기(프로그래머스/MySQL/Level 5) (81) | 2023.12.01 |