조건별로 분류하여 주문상태 출력하기
https://school.programmers.co.kr/learn/courses/30/lessons/131113
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1) 문제
출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문 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 |
2) 예시
예를 들어 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 | 출고대기 |
3) 풀이
1. 주문아이디, 상품아이디, 출고일(YYYY-DD-MM)을 조회합니다.
● SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE, '%Y-%m-%d'),
2. 출고여부라는 컬럼을 만들고,
CASE 함수를 이용하여 출고일 조건 따라 출고완료, 출고대기, 출고미정으로 값을 넣어줍니다.
● CASE WHEN DATE_FORMAT(OUT_DATE,'%m-%d') <= '05-01' THEN '출고완료'
DATE_FORMAT을 이용하여 OUT_DATE를 MM-YY로 출력되게 한다음, 05-01을 포함하여 이전이면 출고완료
WHEN DATE_FORMAT(OUT_DATE,'%m-%d') > '05-01' THEN '출고대기'
05-01 이후이면 출고대기
ELSE '출고미정'
그 외의 값이면 출고미정으로 표시합니다. (WHEN OUT_DATE IS NULL THEN '출고미정' <<< 이렇게도 가능)
END AS '출고여부'
CASE문을 종료하고 출고여부로 컬럼명을 지정합니다.
※ CASE WHEN 조건 THEN 조건에 따른 값
ELSE 조건에 해당하지 않는 값
END
조건에 해당하면 THEN 이후 값이 나오고, 조건에 해당하지 않으면 ELSE 이후의 값이 반환됩니다.
그리고 CASE를 종료하기 위해 END로 마무리합니다.
3. FOOD_ORDER 테이블에서 값을 가져옵니다.
● FROM FOOD_ORDER
4. 주문번호 오름차순으로 정렬합니다.
● ORDER BY ORDER_ID ASC;
4) 코드
SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE, '%Y-%m-%d'),
CASE WHEN DATE_FORMAT(OUT_DATE,'%m-%d') <= '05-01' THEN '출고완료'
WHEN DATE_FORMAT(OUT_DATE,'%m-%d') > '05-01' THEN '출고대기'
ELSE '출고미정'
END AS '출고여부'
FROM FOOD_ORDER
ORDER BY ORDER_ID ASC;
'Programmers Coding Test > MySQL' 카테고리의 다른 글
[프로그래머스 131123] MySQL - Level3 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2023.09.12 |
---|---|
[프로그래머스 164668] MySQL - Level3 조건에 맞는 사용자와 총 거래금액 조회하기 (0) | 2023.09.01 |
[프로그래머스 144855] MySQL - Level3 카테고리 별 도서 판매량 집계하기 (0) | 2023.09.01 |
[프로그래머스 59043] MySQL - Level3 있었는데요 없었습니다 (0) | 2023.09.01 |
[프로그래머스 59411] MySQL - Level3 오랜 기간 보호한 동물(2) (0) | 2023.09.01 |