본문 바로가기
SQL

본 캠프 3일차 SQL TIL

by Data 학습자 2024. 6. 26.

오늘 풀어본 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131113

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

FOOD_ORDER 테이블에서 5월 1일을 기준으로 주문 ID, 제품ID, 출고일자, 출고여부를 조회하는 SQL문을 작성해주세요. 출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고대기로 미정이면 출고미정으로 출력해주시고, 결과는 주문ID를 기준으로 오름차순 정렬하기

 

우선 테이블이 하나 밖에 없다. 오랜만에 테이블이 하나밖에 없는 데이터를 조사하니 팥없는 팥빵을 먹는 기분이다. 우선 그럼 가장 먼저 해야할 요소는 주문ID, 제품 ID, 출고일을 구하는 것 출고여부를 구하는 값은 일단 간단한 일부터 처리한 뒤 차근차근 해보면 될 일이다.

SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE,'%Y-%m-%d')
FROM FOOD_ORDER

우선 이렇게 주문ID와 제품ID 그리고 출고일을 구하는 쿼리문을 작성했다 그리고 그 결과 값은

주문 ID와 제품 ID 그리고 출고일을 테이블에서 얻어낸 값

그럼 이제 다음으로 해야 할 일은 DATE_FORMAT으로 뽑아낸 출고일을 기준으로 조건을 걸어서 5월 1일 전에 출고된 물품은 출고완료 이후는 출고대기 값이 없는 데이터는 출고미정이라는 값으로 지정해줘야 한다.

 

조건문은 여러가지가 있지만 SQL에서 IF문은 하나의 데이터로 여러 조건을 걸어서 값을구하는 것에는 다소 난해한 면이 있는 것 같아 CASE문을 활용하기로 했다.

SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE,'%Y-%m-%d'),
CASE WHEN ISNULL(OUT_DATE) THEN '출고미정'
     WHEN OUT_DATE <= '2022-05-01' THEN '출고완료'
     WHEN OUT_DATE > '2022-05-01' THEN '출고대기'
     END '출고여부'
FROM FOOD_ORDER

ISNULL 예약문을 써서 출고일의 값이 없으면 출고미정이 출력되게 지정했고
출고일이 5월 1일이거나 작다면(빠르다면) 출고완료가 나오게 지정을 했다.

다음 출고일이 5월 1일보다 크다면(늦는다면) 출고 대기로 지정을 해놓고 이 모든 값은

새로운 출고여부 라는 칼럼을 만들어 거기에 들어가도록 하였다.

출고여부에 5월 1일 기준으로 출고 완료 및 대기 또는 미정이 잘 들어가 있는 모습

 

이렇게 만족이되는 결과값을 얻어내었다.

하지만 아직 조건을 다 달성하지 않았다. 바로 주문 ID를 기준으로 데이터값을 아직 정렬하지 못했다는 점

다만 지금의 내가 풀기엔 너무 쉬운 문제다.

SELECT ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE,'%Y-%m-%d'),
CASE WHEN ISNULL(OUT_DATE) THEN '출고미정'
     WHEN OUT_DATE <= '2022-05-01' THEN '출고완료'
     WHEN OUT_DATE > '2022-05-01' THEN '출고대기'
     END '출고여부'
FROM FOOD_ORDER
ORDER BY ORDER_ID

바로 ORDER BY 예약문에 주문 ID를 조건으로 오름차순으로 정렬하면 되는 일이기 때문에 어려울게 하나 없다.

ORDER BY ORDER ID로 정렬한 모습

그리고 이렇게 풀면서 칼럼들을 보기 더 좋게 바꾸어 결과를 내려 AS문을 사용하다가 내가 작성했던 CASE문에서 굳이 ISNULL이 필요없겠다는 생각이 번뜩이기 시작했다.

SELECT ORDER_ID AS '주문 ID', PRODUCT_ID AS '제품 ID', DATE_FORMAT(OUT_DATE,'%Y-%m-%d') AS '출고일',
CASE WHEN OUT_DATE <= '2022-05-01' THEN '출고완료'
     WHEN OUT_DATE > '2022-05-01' THEN '출고대기'
     ELSE '출고미정'
     END '출고여부'
FROM FOOD_ORDER
ORDER BY ORDER_ID

그렇게 내놓은 최종 쿼리문 각 칼럼에 우리가 직관적으로 보고 판단하기 좋게 한글 칼럼으로 바꾸고 쓸모없던 ISNULL 조건문을 제외하고 ELSE 라는 조건문으로 쿼리문을 더 짧고 직관적으로 바꿔보았다.

결과값은 바뀌지 않으면서 칼럼도 보기 좋아졌다.

 

이렇게해서 쿼리문을 보다 간결하게 바꾸며 각 칼럼도 보기 좋게 한글로 바꿔좋았다.

 

보기 좋은 떡이 먹기도 좋다고 잘 정돈된 쿼리문과 데이터를 보니 마음이 뿌듯해졌다.

'SQL' 카테고리의 다른 글

본 캠프 6일차 SQL TIL  (0) 2024.06.29
본 캠프 5일차 SQL TIL  (0) 2024.06.28
본 캠프 4일차 SQL TIL  (0) 2024.06.27
본 캠프 2일차 SQL TIL  (0) 2024.06.25
본 캠프 1일차 SQL TIL  (0) 2024.06.24