[자동차 대여 기록에서 장기/단기 대여 구분하기]
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
-- +1을 해줘야함!!
-- 대여 기간에서는 시작일과 종료일 모두 포함된 전체 기간을 계산해야 하므로, 시작일 자체도 하루로 포함하기 위해 +1
SELECT HISTORY_ID,
CAR_ID,
DATE_FORMAT(START_DATE,'%Y-%m-%d') START_DATE,
DATE_FORMAT(END_DATE,'%Y-%m-%d') END_DATE,
CASE WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '장기 대여'
ELSE '단기 대여' END RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09-%'
ORDER BY HISTORY_ID DESC;
[자동차 평균 대여 기간 구하기]
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.
-- 내가 짠 쿼리
SELECT CAR_ID,
ROUND(AVG(DATEDIFF(END_DATE, START_DATE)+1),1) AVERAGE_DURATION
FROM (
SELECT CAR_ID,
DATEDIFF(END_DATE, START_DATE) RENT_DATE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
) a
WHERE AVERAGE_DURATION + 1 >= 7
GROUP BY CAR_ID
ORDER BY AVERAGE_DURATION DESC,
CAR_ID DESC;
-- 정답 쿼리
-- 서브쿼리를 쓸 필요 없음
-- 소수점 둘째자리에서 반올림 -> 첫째자리까지만 표현
-- where에 조건을 부여하면 select 전에 적용되기 때문에 오류 => having절에 조건 부여
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 2 DESC, 1 DESC
[헤비 유저가 소유한 장소]
이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요.
-- 내가 짠 쿼리
-- 그룹화된 결과
SELECT ID, NAME, HOST_ID
FROM (SELECT ID, NAME, HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(HOST_ID) >= 2
) A
ORDER BY ID;
-- 정답 쿼리
-- 그룹화된 테이블과 기존 테이블 조인 => 2개 이상 등록한 호스트만 필터링
SELECT ID, NAME, S.HOST_ID
FROM (SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(ID) > 1
ORDER BY ID) S LEFT JOIN PLACES P ON S.HOST_ID = P.HOST_ID
ORDER BY ID
'SQL' 카테고리의 다른 글
SQL 코드카타 오답: CONCAT | FROM절 안에서 JOIN하기 (1) | 2024.12.11 |
---|---|
SQL 코드카타 오답: DISTINCT의 중요성 | AND와 OR (0) | 2024.12.10 |
SQL 코드카타 오답: GROUP BY (1) | 2024.12.06 |
SQL 과제 오답: WITH | WITH RECURSIVE | STEDDEV (0) | 2024.12.05 |
SQL 코드카타 오답: DATE | MAX로 우선 순위가 높은 값 반환하기 | DISTINCT (2) | 2024.12.05 |