시간의 기간을 구할 때는 DATEDIFF 함수를 사용하여 구할 수 있다. DATEDIFF(마지막 날짜, 첫번째 날짜)를 적어주면 그 기간을 구해준다. 이 문제의 경우 30일 간의 대여기록이므로 +1이나 30일-1을 고려하여 풀어주어야 한다.
SELECT HISTORY_ID,
CAR_ID,
DATE_FORMAT(START_DATE,'%Y-%m-%d') AS START_DATE,
DATE_FORMAT(END_DATE,'%Y-%m-%d') AS END_DATE,
CASE WHEN DATEDIFF(END_DATE,START_DATE) >= 29 THEN '장기 대여'
ELSE '단기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC
문제는 프로그래머스 자동차 대여 기록에서 장기/단기 대여 구분하기 에서 풀 수 있다.
장바구니 별로 우유와 요거트내역이 있는 장바구니 번호를 가져오는 건데, 어떻게 시작해야할지 너무 어려웠다. 처음에는 아래와 같이 써 보았다. 요거트가 있는 행과 우유가 있는 행을 가져와서 합치고, 둘에 장바구니 번호가 같으면 추출하는 형식으로 구상하였다.
SELECT CART_ID
FROM (
(SELECT *
FROM CART_PRODUCTS
WHERE NAME IN (SELECT NAME FROM CART_PRODUCTS WHERE NAME LIKE '%YOGURT%'))
UNION
(SELECT *
FROM CART_PRODUCTS
WHERE NAME IN (SELECT NAME FROM CART_PRODUCTS WHERE NAME LIKE '%MILK%'))
) A
GROUP BY CART_ID
HAVING COUNT(CART_ID) >= 2
ORDER BY ID
아래가 옳은 풀이이다. 필요한 COLUMN만 불러오고 WHERE을 간단히 LIKE 로 제시해주어 각각 요거트와 우유가 있는 행의 카트번호만 가져와서 합쳐주었다. 또 둘의 번호가 같으면 카트번호를 반환하도록 HAVING에서 >1 을 제시해주었다.
SELECT CART_ID
FROM
(SELECT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME LIKE '%YOGURT%'
UNION
SELECT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME LIKE '%MILK%'
) A
GROUP BY CART_ID
HAVING COUNT(CART_ID) > 1
ORDER BY CART_ID
위 문제는 프로그래머스의 우유와 요거트가 담긴 장바구니에서 풀 수 있다.
WEEK 3 MON - 특정 기간을 기준으로 구분짓기 (0) | 2024.07.08 |
---|---|
[WIL] 2주차 (0) | 2024.07.05 |
[TIL] WEEK 2 THUR (find_in_set) (0) | 2024.07.04 |
[SQL] 카테고리 별 최대값 정보 가져오기 2 (0) | 2024.07.03 |
[TIL] SQL 세션 풀이 (0) | 2024.07.03 |