SQL

SQL 코드카타 오답: 날짜 차이 | where, having 구분 | 테이블 조인

sawo11 2024. 12. 9. 20:56

[자동차 대여 기록에서 장기/단기 대여 구분하기]

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