천천히 빛나는

MySQL : String, Date 고득점 Kit 본문

STUDY/MYSQL

MySQL : String, Date 고득점 Kit

까만콩 •ᴥ• 2023. 10. 21. 18:14

프로그래머스 SQL 고득점 Kit의 String, Date 문제입니다.

https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit

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, IF(DATEDIFF(END_DATE, START_DATE) >=29, '장기 대여', '단기 대여') AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE YEAR(START_DATE) = 2022 AND MONTH(START_DATE) = 9
ORDER BY HISTORY_ID DESC

DATEDIFF(T1, T2); T2-T1의 DAY를 반납한다. 1월 30일에서 1월 1일을 빼면 29가 나오기 때문에 29를 기준으로 두어야 한다. 당일 반납도 1일 대여이기 때문이다.

 

2. 조건에 부합하는 중고거래 상태 조회하기

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

CASE WHEN 을 사용해서 구현하였다

 

3. 대여 기록이 존재하는 자동차 리스트 구하기 

SELECT DISTINCT C.CAR_ID
FROM CAR_RENTAL_COMPANY_CAR AS C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H ON C.CAR_ID = H.CAR_ID
WHERE C.CAR_TYPE ='세단' AND MONTH(START_DATE) = 10
ORDER BY C.CAR_ID DESC;

간단한 문제였다

 

4. 자동차 대여 기록 별 대여 금액 구하기

SELECT DISTINCT HISTORY_ID, 
CASE WHEN DATEDIFF(END_DATE, START_DATE) BETWEEN 6 AND 28
THEN ROUND(DAILY_FEE * (DATEDIFF(END_DATE, START_DATE)+1) * (SELECT 1- DISCOUNT_RATE / 100 FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN WHERE C.CAR_TYPE = CAR_TYPE AND DURATION_TYPE LIKE '7일%'))

WHEN DATEDIFF(END_DATE, START_DATE) BETWEEN 29 AND 88
THEN ROUND(DAILY_FEE * (DATEDIFF(END_DATE, START_DATE)+1) * (SELECT 1- DISCOUNT_RATE / 100 FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN WHERE C.CAR_TYPE = CAR_TYPE AND DURATION_TYPE LIKE '30일%'))

WHEN DATEDIFF(END_DATE, START_DATE) >= 89
THEN ROUND(DAILY_FEE * (DATEDIFF(END_DATE, START_DATE)+1) * (SELECT 1- DISCOUNT_RATE / 100 FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN WHERE C.CAR_TYPE = CAR_TYPE AND DURATION_TYPE LIKE '90일%'))

ELSE DAILY_FEE * (DATEDIFF(END_DATE, START_DATE)+1)
END AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H ON C.CAR_ID = H.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS P ON C.CAR_TYPE = P.CAR_TYPE
WHERE C.CAR_TYPE = '트럭'
ORDER BY FEE DESC, HISTORY_ID DESC

복잡했지만 조건을 이해하면 쉽게 풀 수 있었다

 

5. 조건에 맞는 사용자 정보 조회하기

SELECT USER_ID, NICKNAME, CONCAT(CITY, ' ', STREET_ADDRESS1, ' ', STREET_ADDRESS2) AS 전체주소, CONCAT(SUBSTR(TLNO, 1, 3),'-',SUBSTR(TLNO, 4, 4),'-',SUBSTR(TLNO, 8))  AS 전화번호
FROM USED_GOODS_BOARD AS B
JOIN USED_GOODS_USER AS U ON B.WRITER_ID = U.USER_ID
GROUP BY USER_ID
HAVING COUNT(*) >= 3
ORDER BY USER_ID DESC;

CONCAT : 문자열을 합칠 수 있다. CONCAT(문자열, 문자열 ...)

SUBSTR / SUBSTRING : 문자열을 자를 수 있다. SUBSTR(원래 문자, 시작위치, 길이) 시작 위치를 음수로 하면 뒤에서 부터 읽는다

https://extbrain.tistory.com/62

 

[MySQL] 문자열 부분 가져오기 (LEFT, MID, RIGHT 함수)

▶MySQL 문자열 부분 가져오기 (LEFT, MID, RIGHT 함수) ▶설명 MySQL에서 문자열에 일부분을 가져오는 함수는 대표적으로 3가지가 존재합니다. LEFT : 문자에 왼쪽을 기준으로 일정 갯수를 가져오는 함수

extbrain.tistory.com

LEFT, MID, RIGHT 함수를 사용해서 구현할 수도 있다

 

6. 카테고리 별 상품 개수 구하기

SELECT  LEFT(PRODUCT_CODE, 2) AS CATEGORY, COUNT(*)
FROM  PRODUCT 
GROUP BY  CATEGORY

LEFT 대신 SUBSTRING 또는 SUBSTR 또는 MID로 구현할 수도 있다

 

프로그래머스 MySQL 문제는 여기까지 풀도록 하겠다. 다른 String, Date 문제는 새로운 함수가 필요 없다.

'STUDY > MYSQL' 카테고리의 다른 글

MySQL : JOIN 연산 고득점 Kit  (1) 2023.10.21
MySQL : JOIN 연산 + 기본 예제  (0) 2023.10.21
MySQL : IS NULL 문 고득점 Kit  (0) 2023.10.21
MySQL : GROUP BY 문 고득점 Kit  (0) 2023.10.21
MySQL : SUM, MAX, MIN 문 고득점 Kit  (1) 2023.10.20