SQL/MY SQL 문제 풀이(프로그래머스)

[MYSQL] PROGRAMMERS_대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

SQL공부 2024. 2. 23. 05:19
반응형

SELECT MONTH(START_DATE)MONTH,CAR_ID,COUNT(CAR_ID) as RECORDS
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE 1=1
    AND DATE_FORMAT(START_DATE,'%Y-%m') between '2022-08' and '2022-10'
    AND CAR_ID in 
        (SELECT CAR_ID
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        where 1=1
        and DATE_FORMAT(START_DATE,'%Y-%m') between '2022-08' and '2022-10'
        group by 1
        having COUNT(CAR_ID)>=5) 
    GROUP BY 1,2
    ORDER BY 1,2 desc

 

문제
 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외

 

 고려해야할 조건이 좀 많은 것 같다. LV3중 가장 정답률이 낮은 문제이다. (참고로 글은 order by level asc, 정답률 desc 로 작성하고 있다.)

문제 풀다가 골머리 아팠는데 다풀고나니 파란색 조건은 대체 왜 있는지 약간 의문인 조건이다.. 굳이 추가해서 문제 자체를 헷갈리게 해서 화가나는 부분 이었다. 굳이 추가 할 필요 없는 조건인데 해당 부분 때문에 꼬이게 되었다. 월별중 하나라도없으면 해당 차량을 다 제거 하고 값을 뽑으라는 뜻인 줄... 저런 조건 문은 좀 없애면 좋겠다. 어차피 값이 없으면 당연히 .. 결과에서 제외되는데 화가난다.

 

 살펴보자면 파란색 조건 부분을 제외한 나머지 조건을 만족하면 된다.일단 8월 부터 10월까지의 총 대여 횟수가 5회 이상이어야 한다. 일단 8월부터 10월까지 총 5건 이상 대여한 차량들의 집합컬럼을 만들어야 한다. 먼저 날짜 범위 부터 지정해야하는데 해당 값이 범위 이기 때문에 between을 쓸 수 밖에 없다. (그외엔 노가다..) 이땐 like 와 다르게 %를 사용 못해서 DATE_FORMAT을 통해 변환을 해준후 월 값에 맞게 바꾸어 주었다. 그리고 CAR_ID의 집합을 뽑아야 하니 SELECT 문에 CAR_ID를 넣고 그룹해주었다. 그러면 차들이 그룹이 되고 having 절에서 COUNT 후 5건 이상 조건을 달아주면 그룹된 대상의 car_id가 5건 이상인 녀석들이 걸러진다.

 

이렇게 8~10월 사이 총 5건 이상의 자동차 집합들이 만들어 지는데 이를 서브쿼리로 둔다. 그리고 메인쿼리를 새로짜는데 메인쿼리는 문제가 요구하는 컬럼들을 골라준다. 일단 메인쿼리 집합도 8~10월 의 기간동안 월별 대여 횟수이므로 같은 기간을 필터조건으로 그대로 복사해서 넣어준다. 그리고 CAR_ID 조건을 in으로 아까 만들었던 총 5건 이상의 자동차 집합을 구한 서브쿼리로 필터링 해준다. 이러면 붉은색 으로 칠한 문제 조건이 해결된다. 그리고 SELECT문으로 가는데 요구하는 컬럼이 월만 표기하길 원하니 MONTH함수로 표기해주고 RECORD 함수도 월별 대여 건수를 표기 원하니 COUNT를 걸어준다. 그러나 이런 월별/자동차별 건수를 행마다 정확히 표기하기 위해선 앞의 RECORD컬럼의 선행하는 두컬럼이 그룹이 되어 있어야 한다. 그래야 COUNT가 월/자동차별 건수로 알맞은 값이 나온다. 

그렇게 GROUB BY를 해준후 alias 를 걸어 마무리해주고 최종적으로 정렬을 해서 마무리해준다

 

너무 화가났던 문제다.. 다풀었는데 파란 마지막 조건 때문에 화나서 제외하고 제출했더니 정답처리가 되었다..

시험에서는 정답을 비교도 못하는데 저런식으로 나오면 진짜 화가날거같다.. 문과에서 이과 교재 문제를 접하면서 느끼는데 정말 표현을 잘 못쓰는것 같다.. 물론 나도 잘쓰는 편은 아니지만 너무 애매하게 표현을 해서 의도하는 바를 알 수 없게만드는 경우가 너무 많은 것 같다..

반응형