출석관련 간단한 쿼리문 질문드립니다. 0 6 1,877

by 김귀염 [Oracle 기초] [2014.11.17 11:40:41]


1. 시간표 테이블 (TIME1)

2. 출석정보 테이블 (TIME2)

 

연속 N일 이상 결석일경우 Y/N값으로 처리를 하고 싶은데

PL/SQL 말고는 방법을 모르겠네요

 

SELECT 문으로 한번에 처리할 수 있는 방법이 없을까요?

 

Ex)

TIME1 = 11월달 시간표 존재

TIME2 = 11월달 시간표에 해당하는 출석정보

by 마농 [2014.11.17 11:45:59]

다음 세가지 테이블에 대한 예시자료를 표 형태로 보여주세요.
1. 시간표 테이블 (TIME1)
2. 출석정보 테이블 (TIME2)
3. TIME1, TIME2 로부터 도출되는 결과리스트


by 김귀염 [2014.11.17 13:01:14]

 

[TIME1]

ID DT S_TM E_TM
A2014 20141101 0900 1100
A2014 20141105 0900 1100
A2014 20141106 0900 1100

 

[TIME2]

ID DT S_TM E_TM STAT
A2014 20141101 0901 1100 1
A2014 20141105 0000 0000 2
A2014 20141106 0000 0000 2
A2014 20141107 0900 1059 1

 

TIME1은 실제 시간표, TIME2는 시간표에 따른 출석 결과값이 들어있습니다.

TIME2의 STAT는 1이면 출석 / 2이면 결석을 의미하는 컬럼입니다

결과값 = Y/N(5일연속결석 여부)

PL/SQL 없이도 가능한 방법을 연구중인데 도저히 방법이 안떠오르네요 ㅠㅠ


by 마농 [2014.11.17 13:15:09]

제시하신 time1, time2 로부터 도출되는 결과 리스트 자체를 보여주세요.
"5일연속결석 여부"라는 짧막한 글귀 말구요.
"5일연속결석 여부"를 어떻게 판별하는지? 구체적 설명이 필요합니다.
제시하신 예제를 가지고 처음 보는 사람이 이해 가능할지 의문이네요?
예시자료 및 설명이 부족합니다.


by 마농 [2014.11.17 13:56:52]

s_tm, e_tm 은 출결여부에 아무런 영향이 없는 항목인듯 합니다.
time2 안에 이미 time1 값이 포함된 듯 합니다.
따라서 time2 의 (id, dt, stat) 만으로 결과 도출이 가능할 듯 합니다.
예시자료가 부족하여 제가 추가로 만들어 봤습니다.
A2014 는 5일 이상 결석했지만 5일연속결석은 아님(N).
B2015 는 5일연속결석 (Y).

WITH time2 AS
(
SELECT 'A2014' id, '20141101' dt, 1 stat FROM dual
UNION ALL SELECT 'A2014', '20141105', 2 FROM dual
UNION ALL SELECT 'A2014', '20141106', 2 FROM dual
UNION ALL SELECT 'A2014', '20141107', 1 FROM dual
UNION ALL SELECT 'A2014', '20141108', 2 FROM dual
UNION ALL SELECT 'A2014', '20141109', 2 FROM dual
UNION ALL SELECT 'A2014', '20141110', 2 FROM dual
UNION ALL SELECT 'A2014', '20141111', 2 FROM dual
UNION ALL SELECT 'B2015', '20141101', 1 FROM dual
UNION ALL SELECT 'B2015', '20141102', 2 FROM dual
UNION ALL SELECT 'B2015', '20141103', 2 FROM dual
UNION ALL SELECT 'B2015', '20141104', 2 FROM dual
UNION ALL SELECT 'B2015', '20141105', 2 FROM dual
UNION ALL SELECT 'B2015', '20141106', 2 FROM dual
UNION ALL SELECT 'B2015', '20141107', 2 FROM dual
UNION ALL SELECT 'B2015', '20141108', 1 FROM dual
UNION ALL SELECT 'B2015', '20141109', 2 FROM dual
UNION ALL SELECT 'B2015', '20141110', 2 FROM dual
UNION ALL SELECT 'B2015', '20141111', 2 FROM dual
UNION ALL SELECT 'B2015', '20141112', 1 FROM dual
UNION ALL SELECT 'B2015', '20141113', 1 FROM dual
UNION ALL SELECT 'B2015', '20141114', 2 FROM dual
UNION ALL SELECT 'B2015', '20141115', 1 FROM dual
)
SELECT id
     , MAX(CASE WHEN cnt = 5 AND st = 2 THEN 'Y' ELSE 'N' END) flag
  FROM (SELECT id, dt, stat
             , COUNT(*)  OVER(PARTITION BY id ORDER BY dt ROWS 4 PRECEDING) cnt
             , MIN(stat) OVER(PARTITION BY id ORDER BY dt ROWS 4 PRECEDING) st
          FROM time2
         WHERE dt LIKE '201411%'
         --AND id = 'A2014'
        )
 GROUP BY id
;

 


by 김귀염 [2014.11.18 10:09:10]

제가 질문을 제대로 못드렸네요 ㅠㅠ

마농님 답변 정말 감사드립니다


by 마농 [2014.11.20 16:04:05]
SELECT id
     , CASE WHEN LISTAGG(stat) WITHIN GROUP(ORDER BY dt) LIKE '%22222%'
            THEN 'Y' ELSE 'N' END result
  FROM time2
 GROUP BY id
 ORDER BY id
;

 

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