강의로 돌아가기
skinnyname@gmail.com

왜 반드시 서브 쿼리에도 "MONTH(START_DATE) BETWEEN 8 AND 10"를 써줘야하나요 ㅠㅠ?

SELECT MONTH(STARTDATE) AS 'MONTH', CARID, COUNT(CARID) AS 'RECORDS' FROM CARRENTALCOMPANYRENTALHISTORY
WHERE CAR
ID IN (SELECT CARID FROM CARRENTALCOMPANYRENTALHISTORY
GROUP BY CAR
ID
HAVING COUNT(CARID)>=5)
AND MONTH(START
DATE) BETWEEN 8 AND 10
GROUP BY MONTH(STARTDATE), CARID
HAVING RECORDS > 0
ORDER BY MONTH(STARTDATE) ASC, CARID DESC

어차피 WHERE 조건이 (1) 대여 시작일의 달이 8월과 10월 사이 이면서 (2) 5회 이상 빌린 CAR_ID 목록에 있는 경우에 한 하는 건데
굳이 대여 시작일의 달이 8월과 10월 사이라는 조건을 서브쿼리에도 두는 이유가 있나욤?

작성중인 코드―solution.sql
1
2
3
4
5
6
7
8
9
SELECT MONTH(START_DATE) AS 'MONTH', CAR_ID, COUNT(CAR_ID) AS 'RECORDS' FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
               GROUP BY CAR_ID
               HAVING COUNT(CAR_ID)>=5
               )
               AND MONTH(START_DATE) BETWEEN 8 AND 10 
GROUP BY MONTH(START_DATE), CAR_ID
HAVING RECORDS > 0
ORDER BY MONTH(START_DATE) ASC, CAR_ID DESC
1 개의 답변
Angela Park

이전 댓에 다시 물어보셨던 부분 보고 왔습니다!
결론부터 얘기하면 적어주신 쿼리는 8월 부터 10월까지의 기간에 대해, 전체 대여기록 중 대여기록이 5회 이상인 차량들과 그들의 월별 대여 횟수입니다.

이럴 때는 "이 쿼리(메인 쿼리 혹은 서브 쿼리)에서 어떤 값이 조회가 될까/되지 않을까?"에 대해 생각해보시면 좋다고 생각해요!

예를 들어 skinnyname님이 적으셨던 쿼리에 의하면,
a라는 차량이
[7월 3, 8월 0, 9월 0, 10월 2, 11월 2],
b라는 차량은
[7월 2, 8월 2, 9월 3, 10월 0, 11월 1] 대여기록이 있다고 가정해볼게요.

현재 적으신 서브쿼리

(SELECT CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
               GROUP BY CAR_ID
               HAVING COUNT(CAR_ID)>=5
               )

에서 a와 b모두 조회된 차량일 것입니다.

그리고 메인 쿼리에서 그 차량들에 대해,
WHERE ~~~ AND MONTH(START_DATE) BETWEEN 8 AND 10 에 의해서, 8월 부터 10월에 해당하는 기록을 조회하게 됩니다.

그렇다면 HAVING 조건에 의해 출력 결과는
a차량은 10월 2회가 조회되고
b차량은 8월 2회 9월 3회가 조회될 것입니다.

그러나 문제에서는 8월과 10월 사이의 총 대여 횟수가 5회 이상인 차량들에 대해서 조회를 하라고 하였습니다.
a차량은 8월 0, 9월 0, 10월 2 이므로 조건에 맞지 않지만 함께 조회되게 됩니다.

적어주신 WHERE절의 조건이 적용되는 부분은 조회하려는 대상(차량)에 대한 조건(차량)이 아니라 메인쿼리의 조회(보려는 기간) 조건입니다. 메인쿼리는 서브쿼리로서 추출된 car_id에 대하여 테이블에 표시할 기간을 정하는 것이지 추출하려는 car_id와는 상관이 없기 때문에 서브쿼리에도 써주어야 합니다.

따라서 a와 같은 차량이 나오지 않게 하기 위해 서브쿼리에도 대여기록을 8~10월에 한정하는 WHERE 조건이 필요하게 됩니다.

아! 참고로 '코드 실행'을 보고서 유추하시면 안됩니다! 제출 시 테스트되는 input 테이블은 다른 데이터로 채점을 하는 것 같더라구요 🤣
저도 공부하는 입장이라 100% 맞을 순 없으니 정말 잘 아시는 분이 나타나셨으면 좋겠네요... ㅎㅎ

  • Angela Park

    따라서 댓글 달아주셨던 https://school.programmers.co.kr/questions/44218 질문과는 같은 문제가 아니라 다른 문제인거죠! 44218 문제는 결과가 나왔을 때 표시할 기간을 정하지 않은 문제이고, skinnyname님은 조회할 차량에 대한 조건을 명시하지 않은 문제가 됩니다.

    Angela Park―2023.03.28 23:06
  • 오식

    비슷한 문제로 질문 계속 찾아보다 드디어 이해했습니다. 감사합니다..!

    오식―2024.01.15 16:22
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.