마농님 말씀하신대로 수정을 했는데 좀 더 봐주실수 있는지요 ? 0 2 1,666

by 열심히 [SQL Query] [2012.04.24 12:14:30]


마농님 답변 감사합니다.

마농님이 수정하라는데로 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 학교, 학번, 과목
;

by 마농 [2012.04.24 12:36:00]

2001.01.01 기준으로 해당날짜에 모두 종료가 되어야 하는데
종료되지 않은 자료가 존재하므로 지연이 맞는듯 한데요.
이는 기준을 어떻게 보느냐에 따라 다를 수 있는것이니...
해당 표시 기준을 표시해 주는 조건절을 조금 손보시면 됩니다.
'지연' 조건에 붙어 있는 이퀄(=) 조건을 빼서 아래 있는 시험상태 조건에 붙이세요.
CASE WHEN 시험종료일 <  '2000-01-01' THEN '지연'
WHEN 시험종료일 >= '2000-01-01' THEN 시험상태


by 손님 [2012.04.24 16:00:27]

항상 많은 도움 주셔서 감사드립니다.
오늘도 많이 배웠습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입