꿈은 데이터분석가, 취미는 계획

[MY SQL] 그룹별로 필터링 조건이 있는 경우 본문

SQL/sql문풀

[MY SQL] 그룹별로 필터링 조건이 있는 경우

data_2080 2024. 4. 16. 21:41
728x90

출처: [프로그래머스 스쿨 - 코딩테스트 연습 - MY SQL 문제] :  대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/151139#qna


문제(일부): 특정기간동안 총 대여횟수가 5회 이상인 자동차들에 대해서(그룹 필터링1), 월별 자동차 ID별 총 대여횟수(그룹 필터링2)

 

1. 서브쿼리 활용하기

서브쿼리에 그룹 필터링1의 조건을 넣고
메인쿼리에 그룹필터링 2의 조건을 넣음, where절에 그룹필터링 1과 일치하는 CAR_ID사용
SELECT MONTH(START_DATE) MONTH, CAR_ID, COUNT(*) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE MONTH(START_DATE) BETWEEN 8 AND 10
AND CAR_ID IN (SELECT CAR_ID
               FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
               WHERE MONTH(START_DATE) BETWEEN 8 AND 10
               GROUP BY CAR_ID
               HAVING COUNT(*) > 4)
GROUP BY CAR_ID, MONTH(START_DATE)
ORDER BY MONTH ASC, CAR_ID DESC;


WITH A AS( 
    SELECT CAR_ID, COUNT(CAR_ID)
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE MONTH(START_DATE) BETWEEN 8 AND 10
    GROUP BY CAR_ID
    HAVING COUNT(CAR_ID) >= 5)
 

2. WITH절 사용

WITH절에 그룹 필터링1의 조건을 넣고
메인쿼리에 그룹필터링 2의 조건을 넣음, where절에 그룹필터링 1과 일치하는 CAR_ID사용

WITH A AS( 
    SELECT CAR_ID, COUNT(CAR_ID)
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE MONTH(START_DATE) BETWEEN 8 AND 10
    GROUP BY CAR_ID
    HAVING COUNT(CAR_ID) >= 5)

SELECT MONTH(START_DATE) AS MONTH,CAR_ID, COUNT(CAR_ID) AS RECORS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE MONTH(START_DATE) BETWEEN 8 AND 10
    AND CAR_ID IN (SELECT A.CAR_ID FROM A)
GROUP BY CAR_ID, MONTH(START_DATE)
HAVING COUNT(CAR_ID) != 0 
ORDER BY MONTH ASC, CAR_ID DESC
728x90