[SQL]프로그래머스 LV.3 서브쿼리 + GROUP BY 함수 사용

선뀰·2023년 10월 10일
0

1. 문제

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

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

2. 풀이

SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (SELECT CAR_ID
                FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31
                GROUP BY CAR_ID
                HAVING COUNT(*) >= 5)
AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY MONTH(START_DATE), CAR_ID
HAVING COUNT(*) > 0
ORDER BY MONTH(START_DATE) ASC, CAR_ID DESC;

조건 1. 총 대여 횟수 COUNT(*) AS RECORDS 로 나타낸다.
조건 2. 2022년 8~10월까지 총 대여 횟수가 5 이상인 자동차 ,해당 기간 동안의 월별 자동차 ID별 총 대여횟수 리스트를 출력 = 서브쿼리를 생성한다. 다중 행으로 출력되기 때문에 다중 행 연산자인 IN을 사용한다.
조건 3. ~별 이라는 키워드가 나오면 무조건 GROUP BY를 사용해준다.
조건 4. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외한다. 특정 월의 대여 횟수를 출력하기 위해서 조건식을 생성한다.

- 서브쿼리 사용

하나의 SQL문에 포함되어 있는 또 다른 SQL문
SELECT, FROM, WHERE절에 사용된다.

1) SELECT절 서브쿼리 = 스칼라 서브쿼리
한 행, 한 컬럼만 반환하는 서브쿼리이다.

SELECT * , (SELECT , FROM, WHERE)
데이터의 양이 많을수록 실행속도가 느려지기 때문에 거의 사용되지 않는다.

2) FROM절 서브쿼리 = 인라인 뷰
하나의 동적으로 생성된 테이블처럼 사용된다.
열 이름과 테이블명을 꼭 명시해줘야 한다. SQL문이 실행될 때만 임시적으로 생성된다.

  • 단일 행 서브 쿼리
    단일 행 비교 연산자 : =, <, <=, >, >=, <>)와 함께 사용할 때는 서브쿼리의 결과 건수가 반드시 1건 이하여야 한다. 2건 이상이 된다면 오류가 발생한다.

  • 다중 행 서브쿼리
    서브쿼리 결과가 2건 이상 반환되면 다중 행 비교 연산자와 함께 사용된다.
    IN : 서브쿼리의 결과에 존재하는 임의의 값과 동일한 조건
    ALL : 서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건
    ANY : 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건
    EXISTS : 서브쿼리의 결과를 만족하는 값이 존재하는지 여부 확인

  • 다중 칼럼 서브쿼리
    서브쿼리 결과로 여러 개의 컬럼이 변환되어 메인쿼리의 조건과 동시에 비교된다.

  • 연관 서브쿼리
    서브쿼리 내에 메인쿼리 컬럼이 사용된 서브쿼리이다.

SELECT A.AA, A.BB, A.CC
FROM ABC AS A
WHERE (A.AA, A.BB) IN (SELECT B.CC, B.BB
						FROM DEF AS B
                        WHERE B.BB = A.BB) 
                    메인 쿼리의 컬럼을 서브쿼리에 사용한다. 
  • HAVING절 서브쿼리
    그룹함수와 함께 사용될 때 그룹핑된 결과에 대해 부가적인 조건을 주기 위해 사용된다.
SELECT T1.C1, T2.C1, T2.C2
FROM T1 AS T1, T2 AS T2
WHERE T1.C1 = T2.C1
GROUP BY T1.C1, T2.C1 T2.C2
HAVING AVG(T1.C1) < (SELECT AVG(C1)
					FROM T2); 
profile
공부 하는 방법을 배우는 중

0개의 댓글

Powered by GraphCDN, the GraphQL CDN