SQL*Plus, 문제풀이

SQL*Plus, 문제풀이

Q: 월 사용료는 정액제로 계산
사유에 따라 다양한 감액 요인발생
장애자에 대한 감액
연체에 의한 사용 정지시 감액
분실로 인한 사용 중지시 감액
본인의 사용 정지 요청시 감액
감액 요인은 임의에 기간에 중첩발생
장애자 감액외는 중첩되어도 한가지 감액 요인으로 간주
장애기간 중에 다른 감액이 없으면 20%,다른 감액이 있는 날은 감액 계산후20%
장애가 아닌 경우의 감액율은 90%
사용자 수는 약 5,000,000 명

A:

SELECT 고객코드
	, SUM(950 * NVL(감액율1,1) * NVL(감액율2,1)) as 감액금액
	, COUNT(감액율1||감액율2) as 감액일수
FROM 
(
	SELECT x.고객코드
		, AVG(decode(상태, '분실', 0.9, '정지', 0.9, '일시',0.9)) as 감액율1
		, MIN(decode(상태, '장애', 0.2)) as 감액율2
	FROM 
	(
		SELECT 
			고객코드
			, 상태
			, GREATEST('19980601', 시작일) as 시작일
			, LEAST('19980630', 종료일) as 종료일
		FROM 고객상태변경
		WHERE 상태 IN ('분실', '정지', '일시', '장애')
		AND 종료일 >= '19980601'
		AND 시작일 <= '19980630'
	) x
	, COPY_T y
	WHERE  y.NO BETWEEN SUBSTR(x.시작일,7,2) AND SUBSTR(x.종료일,7,2)
	GROUP BY x.고객코드, y.NO 
)
GROUP BY 고객코드;

- 인덱스 구성
상태 + 종료일 + 시작일

원문 출처
Encore - 대용량 데이터베이스

Leave a Reply