[코드카타 스터디]SQL_2(57,59번 문제)

Arin lee·2024년 10월 22일

문제 57,59.

문제 링크

57번. https://school.programmers.co.kr/learn/courses/30/lessons/164672

59번. https://school.programmers.co.kr/learn/courses/30/lessons/157340

57번
USED_GOODS_BOARD 테이블에서 2022년 10월 5일에 등록된 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회하는 SQL문을 작성해주세요. 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력해주시고, 결과는 게시글 ID를 기준으로 내림차순 정렬해주세요.

#1
SELECT BOARD_ID, WRITER_ID, TITLE, PRICE,
       IF(STATUS= 'SALE', '판매중',IF(STATUS='RESERVED','예약중','거래완료'))STATUS
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = '2022-10-05'
ORDER BY 1 DESC;


#2
SELECT board_id, writer_id, title, price, 
		  	CASE WHEN status='sale' THEN '판매중'
				     WHEN status='reserved' THEN '예약중'
				     WHEN status='done' THEN '거래완료' END as status
From used_goods_board
WHERE created_date LIKE '2022-10-05%'
ORDER BY 1 DESC;


#3
SELECT BOARD_ID	,WRITER_ID,	TITLE ,PRICE,
     case when STATUS = 'SALE' then '판매중'
          when STATUS = 'RESERVED' then "예약중"
          when STATUS = 'DONE' then "거래완료" end STATUS
from USED_GOODS_BOARD
where date_format(CREATED_DATE,"%Y-%m-%d") = '2022-10-05'
order by BOARD_ID desc

#4
SELECT board_id, writer_id, title, price, 
       case when status = 'DONE' then '거래완료'
            when status = 'SALE' then '판매중'
            else '예약중' end status
FROM used_goods_board
WHERE created_date = '2022-10-05'
ORDER BY 1 desc

#5
SELECT BOARD_ID, WRITER_ID, TITLE, PRICE, 
    CASE 
        WHEN STATUS = 'DONE' THEN '거래완료'
        WHEN STATUS = 'SALE' THEN '판매중'
        WHEN STATUS = 'RESERVED' THEN '예약중' END AS STATUS
FROM USED_GOODS_BOARD
WHERE SUBSTR(CREATED_DATE, 1, 10) = '2022-10-05' 
ORDER BY BOARD_ID DESC

best

SELECT board_id, writer_id, title, price, 
       case when status = 'DONE' then '거래완료'
            when status = 'SALE' then '판매중'
            else '예약중' end status
FROM used_goods_board
WHERE created_date = '2022-10-05'
ORDER BY 1 desc

-> case구문의 원리를 잘 사용하였고, 조건문을 좀 더 간단하게 사용. 하지만 가독성을 생각하면

SELECT BOARD_ID, WRITER_ID, TITLE, PRICE, 
    CASE 
        WHEN STATUS = 'DONE' THEN '거래완료'
        WHEN STATUS = 'SALE' THEN '판매중'
        WHEN STATUS = 'RESERVED' THEN '예약중' END AS STATUS
FROM USED_GOODS_BOARD
WHERE created_date = '2022-10-05'
ORDER BY BOARD_ID DESC

이런식으로 사용하는 것도 굳! 그리고 값에 null이 있다면, 3번 쿼리문처럼 작성할시, 오류가 발생한다는 것을 기억하기.

59번
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.

#1
SELECT CAR_ID,
       CASE 
           WHEN CAR_ID IN(SELECT CAR_ID
                         FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                         WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE) THEN '대여중'
           ELSE '대여 가능'
       END AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY 1
ORDER BY 1 DESC;

#2
SELECT car_id, 
       CASE WHEN car_id in (SELECT car_id 
                            FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
                            WHERE end_date>='2022-10-16' and 
                                  start_date<='2022-10-16') THEN '대여중'
            ELSE '대여 가능' END as AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY 1
ORDER BY 1 DESC;

#3
select car_id, max(availability) as availability
from
    (
     SELECT *, CASE WHEN start_date > '2022-10-16' then '대여 가능'
               WHEN end_date < '2022-10-16' then '대여 가능'
               else '대여중' end availability
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    ) sq1
group by car_id
order by car_id desc

---------------------------------------------------------------------------------------

SELECT car_id, 
	     CASE WHEN max('2022-10-16' BETWEEN START_DATE AND END_DATE) = 1 THEN '대여중'
       ELSE '대여 가능' END AS availability
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY car_id
ORDER BY car_id desc

#4
SELECT CAR_ID, IF(COUNT(CASE WHEN AVAILABILITY = '대여중' THEN 1 END), '대여중', '대여 가능') AS AVAILABILITY
FROM(   SELECT CAR_ID, 
            IF(SUBSTR(START_DATE, 1,10) <= '2022-10-16' AND
            SUBSTR(end_date, 1,10) >= '2022-10-16', '대여중', '대여 가능') AS AVAILABILITY
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    )S1
GROUP BY CAR_ID
ORDER BY CAR_ID DESC

best

SELECT CAR_ID,
       CASE 
           WHEN CAR_ID IN(SELECT CAR_ID
                         FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                         WHERE '2022-10-16' BETWEEN START_DATE AND END_DATE) THEN '대여중'
           ELSE '대여 가능'
       END AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY 1
ORDER BY 1 DESC;

max()를 활용한 방법은 신선한 접근법이지만, 내가 이해하기에 좀 어려웠다.

사용문법

  • 57번
    • if문 vs 케이스문 구문
      • if문 가독성 저하
      • sql에서는 자주 사용하진 않는다!
  • 59번
    • 스트링 max 사전순!
    • '2022-10-16' BETWEEN START_DATE AND END_DATE
      • 컬럼이 아니라 상수값을 넣어도 됨
profile
Be DBA

0개의 댓글