본문 바로가기

코딩테스트/SQL 코테7

[프로그래머스 SQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 정답 쿼리 SELECT DISTINCT(C.CAR_ID), C.CAR_TYPE, ROUND(DAILY_FEE * 30 - (DAILY_FEE * 30 * (DISCOUNT_RATE/100))) AS FEE FROM CAR_RENTAL_COMPANY_CAR C JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H ON C.CAR_ID = H.CAR_ID JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON C.CAR_TYPE = P.CAR_TYPE WHERE C.CAR_TYPE IN ('세단', 'SUV') AND C.CAR_ID NOT IN ( SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE START_D.. 2023. 8. 14.
[프로그래머스 SQL]조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 정답쿼리 SELECT CONCAT('/HOME/GREP/SRC/', F.BOARD_ID, '/',FILE_ID, FILE_NAME, FILE_EXT) AS FILE_PATH FROM USED_GOODS_FILE F JOIN USED_GOODS_BOARD B ON F.BOARD_ID = B.BOARD_ID WHERE VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD) ORDER BY F.FILE_ID DESC; 해설 이번 문제는 ORDER BY VIEWS \ LIMIT 1; 이렇게 작성하면 안 되나? 헷갈렸던 문제였다. SELECT MAX(VIEWS) FROM USED_GOODS_BOARD 쿼리를 이렇게 작성하면, 조회수가 가장 높은 VIEWS 값 하나만 추출하게 된다.. 2023. 8. 8.
[프로그래머스 SQL] 오랜 기간 보호한 동물(2) 정답 쿼리 SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_INS I JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC LIMIT 2; 해설 FROM ANIMAL_INS I JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID 이 문제는 '입양을 간 동물' 중에 보호 기간이 길었던 동물을 찾는 문제이다. '입양을 간 동물'만 필터링하기 위해서는 입양을 보낸 날짜가 NULL값이 아니어야 한다. 즉, ANIMAL_OUTS의 DATETIME이 결측치가 아니어야 한다. 이는 INNER JOIN을 쓰면, 쉽게 해결할 수 있다. INEER JO.. 2023. 8. 7.
[프로그래머스 SQL] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 정답쿼리 SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(HISTORY_ID) AS RECORDS FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE CAR_ID IN ( SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE (DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10') GROUP BY CAR_ID HAVING COUNT(CAR_ID) >= 5 ) AND (DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10') GROUP BY MONTH(START_DA.. 2023. 8. 3.
[프로그래머스 SQL] 자동차 평균 대여 기간 구하기 정답쿼리 SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE)+1), 1) AS AVERAGE_DURATION FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY GROUP BY CAR_ID HAVING AVERAGE_DURATION >= 7 ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC 설명 날짜 차이를 어떻게 계산해야하는지 알아야 풀 수 있는 문제였다. ROUND(AVG(DATEDIFF(END_DATE, START_DATE)+1), 1) DATEDIFF(시작 날짜, 마지막 날짜) DATDIFF라는 함수에 시작 날짜와 마지막 날짜에 해당하는 Column을 넣어주면, 두 날짜간의 차이를 구할 수 있다. 여기에.. 2023. 8. 2.
[프로그래머스 SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 정답쿼리 SELECT car_id, max(if('2022-10-16' between start_date and end_date, '대여중','대여 가능')) as AVAILABILITY from car_rental_company_rental_history group by car_id order by car_id desc; 설명 2022-10-16일의 조건을 맞추는게 조금 까다로운 문제였다. 쿼리를 하나하나 쪼개서 살펴보겠다. if('2022-10-16' between start_date and end_date, '대여중', '대여 가능') if (조건문, 참일 때 반환하는 값, 거짓일 때 반환하는 값) '2022-10-16'일이 start_date와 end_date 사이에 있으면, '대여중'을 반환하고.. 2023. 7. 31.
[프로그래머스 SQL] 즐겨찾기가 가장 많은 식당 정보 출력하기 정답코드 SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES FROM rest_info WHERE (food_type, favorites) IN (SELECT food_type, max(favorites) FROM REST_INFO GROUP BY FOOD_TYPE) ORDER BY food_type desc; 설명 아마도 이 글을 클릭 한 사람이라면, 아래와 같이 코드를 짜서 오류가 났을 가능성이 클 것같다. SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) AS FAVORITES from rest_info GROUP BY FOOD_TYPE ORDER BY food_type desc; 이렇게 짜게 되면, FOOD_TYPE에 .. 2023. 7. 27.