9/24 SQL with문

성준호·2024년 9월 24일
0

with문은 SQL에서 공통 테이블(CTE, Common Table Expression)을 정의하기 위해 사용된다.
복잡한 쿼리를 재사용 가능하게 해준다.

WITH CTE_name AS (
	-- 하위 쿼리
    SELECT col1, col2 ...
    FROM table
    WHERE cond
)
SELECT col1, col2
FROM CTE_name
WHERE condition

장점

  • 재사용성: 중간에 계산한 결과를 여러번 사용할 수 있다.
  • 가독성: 복잡한 쿼리 로직을 여러 단계로 나눠서 표현
  • 성능 최적화

문제

문제 설명

당신은 도서관의 대여 기록을 관리하는 시스템을 운영하고 있습니다. 대여 기록이 저장된 BOOK_RENTALS 테이블에서 연체된 책들에 대한 정보를 분석하려고 합니다.

BOOK_RENTALS 테이블은 아래와 같은 구조로 되어있습니다.

rental_idbook_idmember_iddays_renteddue_datereturn_date
11001201102024-01-102024-01-20
2100220252024-01-052024-01-04
3100320382024-01-082024-01-15
4100120472024-01-072024-01-06
51002205122024-01-122024-01-15
61003206152024-01-152024-01-25

각 컬럼에 대한 설명은 다음과 같습니다.

  • days_rented: 대여 기간(일수)
  • due_date: 반납 예정일
  • return_date: 실제 반납일

연체는 return_datedue_date보다 늦은 경우로 정의됩니다. 참고로, 날짜 비교는 DATEDIFF 함수를 통해서 사용할 수 있습니다. 즉, DATEDIFF(return_date, due_date) 이걸로 며칠 차이인지 알 수 있어요.

문제

각 도서에 대해 연체된 대여 건수를 계산하고 연체 된 도서들만 대상으로 각 책의 평균 연체 일수를 계산하세요.

정답

WITH overdue_books AS (
  SELECT book_id, COUNT(*) AS overdue_count, AVG(DATEDIFF(return_date, due_date)) AS avg_overdue_days
  FROM book_rentals
  WHERE return_date > due_date
  GROUP BY book_id
)
SELECT book_id, overdue_count, avg_overdue_days
FROM overdue_books;
profile
안녕하세요

0개의 댓글