SQL ) LV3. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기
접근법
- 우선 2022년 8월~10월 이내에 대여된 자동차들을 찾아야 하므로 서브쿼리로 해당 조건을 충족하는 CAR_ID들을 조회했다.
- WHERE절에서 CAR_ID가 서브쿼리 반환값에 존재할 경우 && 대여 시작일이 8~10일 경우에만 조회하도록 했고,
- 이후, START_DATE의 월을 추출한 MONTH칼럼과 CAR_ID 기준으로 그룹화한 뒤, HAVING절에서 RECORDS 칼럼 값이 0보다 큰 경우만 조회하도록 했다.
- RECORDS칼럼은 COUNT함수로 대여개수를 구한 칼럼을 의미
코드
SELECT MONTH(START_DATE) MONTH, CAR_ID, COUNT(*) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN
(SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m-%d') BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5)
AND MONTH(START_DATE) BETWEEN 8 AND 10
GROUP BY MONTH, CAR_ID
HAVING RECORDS > 0
ORDER BY 1 ASC, 2 DESC;
SQL ) LV3. 헤비 유저가 소유한 장소
접근법
- 서브쿼리로 HOST_ID기준 그룹화 했을 때, 그룹별 레코드 수가 2이상인 HOST_ID만 반환했고,
- WHERE 절에서 IN 연산을 통해 HOST_ID가 해당 반환값에 존재할 경우만 조회되도록 했다.
코드
SELECT *
FROM PLACES
WHERE HOST_ID IN (SELECT HOST_ID FROM PLACES GROUP BY HOST_ID HAVING COUNT(*) >= 2)
ORDER BY ID;
SQL ) LV3. 오랜 기간 보호한 동물(2)
접근법
- 보호 기간이 가장 긴 동물을 찾기 위해 FROM절에서 서브쿼리로 보호기간(DATEDIFF 함수 사용) 칼럼과 ANIMAL_ID를 조회하는 인라인 뷰를 생성 ⇒ 여기서 ANIMAL_INS테이블과 ANIMAL_OUTS테이블을 JOIN해 보호 기간을 구했고, 해당 보호 기간이 가장 긴 상위 레코드 2개만 조회하도록 했다.
- 이후, ANIMAL_OUTS칼럼과 인라인뷰 칼럼을 ANIMAL_ID 기준으로 JOIN한 뒤, 인라인뷰 칼럼의 보호기간(DATE)기준 내림차순 정렬했다.
코드
**SELECT O.ANIMAL_ID, NAME
FROM ANIMAL_OUTS O JOIN
(SELECT DATEDIFF(O.DATETIME, I.DATETIME) AS DATE, O.ANIMAL_ID
FROM ANIMAL_OUTS O JOIN ANIMAL_INS I ON O.ANIMAL_ID = I.ANIMAL_ID ORDER BY DATE DESC LIMIT 2) V
ON O.ANIMAL_ID = V.ANIMAL_ID
ORDER BY V.DATE DESC;**
SQL ) LV3. 오랜 기간 보호한 동물(1)
접근법
- 우선 보호소에 들어온 기록은 있지만, 입양 보낸 기록이 없는 동물들을 조회해야 하므로, ANIMAL_INS테이블 기준으로 ANIMAL_OUTS테이블과 LEFT JOIN 수행
- 이때, ANIMAL_OUTS의 ANIMAL_ID가 NULL인 레코드만 조회하도록 WHERE절에 조건을 걸었고,
- 가장 오래 보호소에 있던 상위 3개의 동물을 추려야 하므로, 입양시작일DATETIME 칼럼 기준 오름차순 정렬 후 LIMIT 3 연산 수행
코드
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.ANIMAL_ID IS NULL
ORDER BY DATETIME ASC
LIMIT 3;
'📕 SQL > MySQL' 카테고리의 다른 글
📕[SQL] 24.09.08 SQL (1) | 2024.09.08 |
---|---|
📕[SQL] 24.09.06 SQL (1) | 2024.09.06 |
📕[SQL] 24.09.04 SQL (4) | 2024.09.04 |
📕[SQL] 24.09.01 SQL (0) | 2024.09.01 |
📕[SQL] 24.08.30 SQL (0) | 2024.08.30 |