롤업 통계문의 입니다.
1. AA 5보다 크고 , BB 25보다 크고 , CC 는 0~ 100값을 가지며
2. AA+ BB 가 40을 넘을경우는 CC 값을 0
3. AA+ BB 가 40이 안될경우 CC값을 0~10까지 적용하여 40값이상
4. 년도수 20180131 까지
5. 불가 숫자와 = 5미만~ 40미만 카운트수
6. 년도수 = 실행+ 불가
그렇게 하여 아래와 같이 보여주고 싶은데 카운트 수가 이상합니다, 쿼리 한번 봐주세요
내용 | 전체수 | 년도수 | 실행 | 불가 | 5미만 | 10미만 | 15미만 | 20미만 | 25미만 | 20미만 | 35미만 | 40미만 |
서울 | 330 | 275 | 201 | 48 | 12 | 3 | 1 | 1 | 3 | 6 | 5 | 15 |
합계 | 0 | 275 | 201 | 48 | 12 | 3 | 1 | 1 | 3 | 6 | 5 | 15 |
SELECT F_CODENAME(DECODE(T3.CCODE, NULL , '합계' , CCODE)) AS CNAME
,(SELECT COUNT(CCODE) FROM TB WHERE CCODE = T3.CCODE) 전체수
, COUNT(T3.ANUM) 년도수
, COUNT (CASE WHEN
(CASE WHEN T3.AA >= 5
THEN T3.AA
END +
CASE
WHEN T3.CC >= 5
AND T3.CC <=10
THEN TO_CHAR(T3.CC)
WHEN T3.CC < 5
AND T3. CC >= 0
THEN TO_CHAR(T3.CC)
ELSE '10'
END + NVL(BB,0)) >= 40 AND AA >= 5 AND BB >= 25
THEN '실행'
END)SUCC
, COUNT(CASE WHEN
(CASE WHEN T3.AA < 5
THEN T3.AA
END +
CASE
WHEN T3.CC >= 5
AND T3.CC <=10
THEN TO_CHAR(T3.CC)
WHEN T3.CC < 5
AND T3. CC >= 0
THEN TO_CHAR(T3.CC)
ELSE '10'
END + NVL(BB,0)) < 40 AND AA < 5 AND BB < 25
THEN '불가'
END) FAIL
,COUNT(CASE WHEN T3.CNT < 5 THEN T3.CNT END) 5미만
,COUNT(CASE WHEN T3.CNT >= 5 AND T3.CNT < 10 THEN T3.CNT END) 10미만
,COUNT(CASE WHEN T3.CNT >= 10 AND T3.CNT < 15 THEN T3.CNT END) 15미만
,COUNT(CASE WHEN T3.CNT >= 15 AND T3.CNT < 20 THEN T3.CNT END) 20미만
,COUNT(CASE WHEN T3.CNT >= 20 AND T3.CNT < 25 THEN T3.CNT END) 25미만
,COUNT(CASE WHEN T3.CNT >= 25 AND T3.CNT < 30 THEN T3.CNT END) 30미만
,COUNT(CASE WHEN T3.CNT >= 30 AND T3.CNT < 35 THEN T3.CNT END) 35미만
,COUNT(CASE WHEN T3.CNT >= 35 AND T3.CNT < 40 THEN T3.CNT END) 40미만
FROM (SELECT T1.CCODE
, T1.ANUM
, NVL(T1.AA1, 0) + NVL(T1.AA2, 0) + NVL(T1.AA3, 0) + NVL(T1.AA4, 0) + NVL(T1.AA5, 0) AA
, NVL(T1.BB1, 0) + NVL(T1.BB2, 0) + NVL(T1.BB3, 0) + NVL(T1.BB4, 0) + NVL(T1.BB5, 0) BB
, NVL(T1.CC1, 0) + NVL(T1.CC2, 0) + NVL(T1.CC3, 0) + NVL(T1.CC4, 0) + NVL(T1.CC5, 0) CC
, NVL(T1.AA1, 0) + NVL(T1.AA2, 0) + NVL(T1.AA3, 0) + NVL(T1.AA4, 0) + NVL(T1.AA5, 0)
+ NVL(T1.BB1, 0) + NVL(T1.BB2, 0) + NVL(T1.BB3, 0) + NVL(T1.BB4, 0) + NVL(T1.BB5, 0)
+ NVL(T1.CC1, 0) + NVL(T1.CC2, 0) + NVL(T1.CC3, 0) + NVL(T1.CC4, 0) + NVL(T1.CC5, 0) CNT
FROM (SELECT A.ANUM FROM OR A , QR B
WHERE A.SEQ = B.SEQ
AND A.DATE <= '20180130'
) T2
, TB T1
WHERE T1.ANUM = T2.ANUM
AND T1.CCODE = '09'
) T3
GROUP BY ROLLUP(T3.CCODE)
SELECT NVL(f_codename(ccode), '합계') cname , COUNT(*) tot , COUNT(x) cnt , COUNT(DECODE(succ, 1, x)) succ , COUNT(DECODE(succ, 0, x)) fail , COUNT(CASE WHEN cnt >= 0 AND cnt < 5 THEN x END) "5미만" , COUNT(CASE WHEN cnt >= 5 AND cnt < 10 THEN x END) "10미만" , COUNT(CASE WHEN cnt >= 10 AND cnt < 15 THEN x END) "15미만" , COUNT(CASE WHEN cnt >= 15 AND cnt < 20 THEN x END) "20미만" , COUNT(CASE WHEN cnt >= 20 AND cnt < 25 THEN x END) "25미만" , COUNT(CASE WHEN cnt >= 25 AND cnt < 30 THEN x END) "30미만" , COUNT(CASE WHEN cnt >= 30 AND cnt < 35 THEN x END) "35미만" , COUNT(CASE WHEN cnt >= 35 AND cnt < 40 THEN x END) "40미만" , COUNT(CASE WHEN cnt >= 40 AND succ = 0 THEN x END) "40이상" FROM (SELECT ccode , x , aa + bb + LEAST(cc, 10) AS cnt , CASE WHEN aa >= 5 AND bb >= 25 AND aa + bb + LEAST(cc, 10) >= 40 THEN 1 ELSE 0 END succ FROM (SELECT c.ccode , CASE WHEN a.date <= '20180130' THEN 1 END x , NVL(c.aa1, 0) + NVL(c.aa2, 0) + NVL(c.aa3, 0) + NVL(c.aa4, 0) + NVL(c.aa5, 0) aa , NVL(c.bb1, 0) + NVL(c.bb2, 0) + NVL(c.bb3, 0) + NVL(c.bb4, 0) + NVL(c.bb5, 0) bb , NVL(c.cc1, 0) + NVL(c.cc2, 0) + NVL(c.cc3, 0) + NVL(c.cc4, 0) + NVL(c.cc5, 0) cc FROM or a -- , qr b -- 조인이 필요한지 의문? , tb c WHERE a.anum = c.anum -- AND a.seq = b.seq -- 조인이 필요한지 의문? AND c.ccode = '09' ) ) GROUP BY ROLLUP(ccode) ;
댓글이 좀 늦었습니다 , 마농님 도움 많이 되였습니다. 마농님것을 아주 쬐금 변경했어요 ,, select ccode , x , aa + bb + least(cc, 10) as cnt , aa , bb , case when (aa >= 5 and bb >= 25) then case when aa + bb >= 40 then 1 else case when aa + bb + least(cc, 10) >= 40 then 1 else 0 end end end as succ , case when aa < 5 then aa + bb when bb < 25 then aa + bb when (aa < 5 and bb < 25) then aa + bb end as fail
왜? 다시 고치셨나요?
간결하고 명확하게 개선해 드렸는데...
복잡하고 불분명하게 돌아와 버렸네요?
when aa + bb >= 40
when aa + bb + least(cc, 10) >= 40
이 두 조건중 1번 조건은 어차피 2번 조건에 포함되므로 2번 조건만 체크하면 됩니다.
fail 을 만든 이유는 뭔가요?
succ 가 아니면 fail 일 텐데
성공의 조건을 체크해서 만족하지 못하면 fail 아닌가요?
성공의 조건과 다른 형태의 조건으로 fail 을 체크하네요?
이렇게 하면 성공이 아닌 것 중에 fail 에서 누락되는 것이 발생됩니다.
fail 은 왜 사용했는지? 뭔가 이유가 있을 텐데? 일부분만 올려주셔서 확인이 안되네요.