롤업 통계 관련 문의 드립니다 0 5 788

by 초코초코 [SQL Query] [2018.02.07 09:52:36]


롤업 통계문의 입니다.

 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) 

 

by 마농 [2018.02.07 11:30:57]

실행, 불가, 미만 3가지 종류의 카운트가 기준이 모호하고 쿼리는 서로 제각각이네요.
기준에 대한 설명이 모호합니다.(1,2,3)
기준을 좀더 명확하게 제시해 주셔야 할 것 같네요.
(AA >= 5 AND BB >= 25) 이 조건이 실행의 필수 조건인가요?
(AA >= 5 AND BB >= 25) 이조건을 만족하지 못하더라도 40 만 넘으면 실행이 가능한건가요?


by 초코초코 [2018.02.07 13:28:25]

AA 5 , BB 25 는 필수 입니다.

2. AA+BB  값이 40 보다 크면  CC값은 필요없습니다.

   AA+BB  값이 40 보다 작으면  CC 값을  추가하여  40이상 만들고  (단 CC 값은 최대 1~10까지만 적용)

3. END  + NVL(BB,0)) >= 40  AND AA >= 5 AND BB >= 25  구문에서  (  AND AA >= 5 AND BB >= 25 ) 필수 조건이 아니며  중가로  구문은 제외 하시면되겠습니다., 


by 마농 [2018.02.07 13:22:24]
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)
;

 


by 초코초코 [2018.02.08 16:09:30]
댓글이 좀 늦었습니다 ,  마농님 도움 많이 되였습니다. 
마농님것을 아주 쬐금 변경했어요 ,,

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

 


by 마농 [2018.02.08 16:48:31]

왜? 다시 고치셨나요?
간결하고 명확하게 개선해 드렸는데...
복잡하고 불분명하게 돌아와 버렸네요?
when aa + bb >= 40
when aa + bb + least(cc, 10) >= 40
이 두 조건중 1번 조건은 어차피 2번 조건에 포함되므로 2번 조건만 체크하면 됩니다.
fail 을 만든 이유는 뭔가요?
succ 가 아니면 fail 일 텐데
성공의 조건을 체크해서 만족하지 못하면 fail 아닌가요?
성공의 조건과 다른 형태의 조건으로 fail 을 체크하네요?
이렇게 하면 성공이 아닌 것 중에 fail 에서 누락되는 것이 발생됩니다.
fail 은 왜 사용했는지? 뭔가 이유가 있을 텐데? 일부분만 올려주셔서 확인이 안되네요.

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