안녕하십니까!! 구루비회원분들!!
한가지 질문을 드리고 싶어서 글 올립니다 ㅠㅠ
바로 질문드리겠습니다.
순차적 집계를 하고싶은데..
WITH T AS ( SELECT '홍길동' KORNM, '01' WEEK , 76 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '02' WEEK , 88 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '03' WEEK , 88 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '04' WEEK , 82 TM FROM DUAL --83.5 (V) UNION ALL SELECT '홍길동' KORNM, '05' WEEK , 65 TM FROM DUAL --80.75 (V) UNION ALL SELECT '홍길동' KORNM, '06' WEEK , 33 TM FROM DUAL --67 UNION ALL SELECT '홍길동' KORNM, '07' WEEK , 70 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '08' WEEK , 80 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '09' WEEK , 88 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '10' WEEK , 51 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '11' WEEK , 77 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '12' WEEK , 99 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '13' WEEK , 74 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '14' WEEK , 75 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '15' WEEK , 80 TM FROM DUAL ) SELECT T.* FROM T;
1~3주차 패스
4주차부터 4주간의 합계의 평균값 TM의 값이 80이상인 WEEK를 체크하고 싶습니다..
4주차 (76+88+88+82)/4 = 83.5 로 초과했으므로 'V' 표시
5주차 (88+88+82+65)/4 = 80.75 로 초과했으므로 'V' 표시
6주차 (88+82+65+33)/4 = 67로 미만값이므로 null
어떤방법을 써서 집계할 수 있을까요?
WITH T AS ( SELECT '홍길동' KORNM, '01' WEEK , 76 TMM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '02' WEEK , 88 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '03' WEEK , 88 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '04' WEEK , 82 TM FROM DUAL --83.5 (V) UNION ALL SELECT '홍길동' KORNM, '05' WEEK , 65 TM FROM DUAL --80.75 (V) UNION ALL SELECT '홍길동' KORNM, '06' WEEK , 33 TM FROM DUAL --67 UNION ALL SELECT '홍길동' KORNM, '07' WEEK , 70 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '08' WEEK , 80 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '09' WEEK , 88 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '10' WEEK , 51 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '11' WEEK , 77 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '12' WEEK , 99 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '13' WEEK , 74 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '14' WEEK , 75 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '15' WEEK , 80 TM FROM DUAL ) SELECT KORNM , WEEK , TMM , CASE WHEN TO_NUMBER(WEEK) < 4 THEN NULL ELSE CASE WHEN AVG(TMM) OVER (PARTITION BY KORNM ORDER BY WEEK ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) > 80 THEN 'V' END END FG FROM T;
WITH T AS ( SELECT '홍길동' KORNM, '01' WEEK , 76 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '02' WEEK , 88 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '03' WEEK , 88 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '04' WEEK , 82 TM FROM DUAL --83.5 (V) UNION ALL SELECT '홍길동' KORNM, '05' WEEK , 65 TM FROM DUAL --80.75 (V) UNION ALL SELECT '홍길동' KORNM, '06' WEEK , 33 TM FROM DUAL --67 UNION ALL SELECT '홍길동' KORNM, '07' WEEK , 70 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '08' WEEK , 80 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '09' WEEK , 88 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '10' WEEK , 51 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '11' WEEK , 77 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '12' WEEK , 99 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '13' WEEK , 74 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '14' WEEK , 75 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '15' WEEK , 80 TM FROM DUAL ) SELECT T.* , AVG(TM) OVER(ORDER BY WEEK ROWS BETWEEN 3 PRECEDING AND 0 FOLLOWING ) V1 , CASE WHEN AVG(TM) OVER(ORDER BY WEEK ROWS BETWEEN 3 PRECEDING AND 0 FOLLOWING ) >= 80 THEN 'V' END V2 FROM T;
WITH T AS ( SELECT '홍길동' KORNM, '01' WEEK , 76 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '02' WEEK , 88 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '03' WEEK , 88 TM FROM DUAL -- NULL UNION ALL SELECT '홍길동' KORNM, '04' WEEK , 82 TM FROM DUAL --83.5 (V) UNION ALL SELECT '홍길동' KORNM, '05' WEEK , 65 TM FROM DUAL --80.75 (V) UNION ALL SELECT '홍길동' KORNM, '06' WEEK , 33 TM FROM DUAL --67 UNION ALL SELECT '홍길동' KORNM, '07' WEEK , 70 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '08' WEEK , 80 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '09' WEEK , 88 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '10' WEEK , 51 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '11' WEEK , 77 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '12' WEEK , 99 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '13' WEEK , 74 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '14' WEEK , 75 TM FROM DUAL UNION ALL SELECT '홍길동' KORNM, '15' WEEK , 80 TM FROM DUAL ) SELECT KORNM ,WEEK ,TM ,CASE WHEN SUM(TM) OVER(PARTITION BY KORNM ORDER BY WEEK ROWS BETWEEN 3 PRECEDING AND CURRENT ROW ) /4 >= 80 THEN 'V' END CK_80 FROM T