마농님 답변 감사합니다.
마농님이 수정하라는데로 ISNULL 부분의 서브쿼리를 일단 수정했습니다.
데이타를 2000-01-01 로 시험시작일을하고 조회기준을 '2000-01-01' 로 하면 '지연'이 나옵니다.
2000-01-02 기준일자로 조회를 하면 자료가 모두 2000-01-01 이므로 당연히 지연이 나오는게 맞지만
현재 조회기준이 '2000-01-01'이기 때문에 시험완료를 제외하고서라도
2000-01-01 날짜에 두개의 상태값인 '시험중' 이나 '시험계획' 중에서 우선순위인
시험중이 나오게 할 수는 없는지요 ?
날짜가 중복이 안될땐 날짜별로 상태값이 있어서 별 문제 없이 잘되는데
중복된 날짜가 있는 경우 한 날짜에 상태값이 여러개가 존재할 수 있습니다.
따라서 '완료 '를 제외하고라도 '시험중', '시혐계획' 일때는 우선순위가 앞에 있는 '시험중'이 나오게 할수 있는지요 ?
WITH t(학교, 학번, 과목, 시험방법, 시험시작일, 시험상태) AS
(
SELECT 'AAA', '001', '국어', 'A', '2000-01-01', '시험완료'
UNION ALL SELECT 'AAA', '001', '국어', 'B', '2000-01-01', '시험중'
UNION ALL SELECT 'AAA', '001', '국어', 'C', '2000-01-01', '시험계획'
UNION ALL SELECT 'AAA', '001', '국어', 'D', '2000-01-01', '시험계획'
)
SELECT 학교, 학번, 과목
, MIN(시험상태_A) 시험상태_A
, MIN(시험상태_B) 시험상태_B
, MIN(시험상태_C) 시험상태_C
, MIN(시험상태_D) 시험상태_D
, ISNULL(MAX(
CASE WHEN 시험상태 != '시험완료'
THEN CASE WHEN 시험종료일 <= '2000-01-01' THEN '지연'
WHEN 시험종료일 > '2000-01-01' THEN 시험상태
END
END
), '시험완료') AS 시험상태
FROM (
SELECT 학교, 학번, 과목
, CASE 시험방법 WHEN 'A' THEN 시험상태 END AS 시험상태_A
, CASE 시험방법 WHEN 'B' THEN 시험상태 END AS 시험상태_B
, CASE 시험방법 WHEN 'C' THEN 시험상태 END AS 시험상태_C
, CASE 시험방법 WHEN 'D' THEN 시험상태 END AS 시험상태_D
, 시험상태
, 시험방법
, 시험시작일
, ISNULL(
(
SELECT TOP 1 b.시험시작일
FROM t b
WHERE b.학교 = a.학교
AND b.학번 = a.학번
AND b.과목 = a.과목
AND b.시험방법 > a.시험방법
ORDER BY b.시험방법
), '9999-12-31') AS 시험종료일
FROM t a
) x
GROUP BY 학교, 학번, 과목
ORDER BY 학교, 학번, 과목
;
항상 많은 도움 주셔서 감사드립니다.
오늘도 많이 배웠습니다.