월별 통계구하는게 어려워 질문드립니다. 0 4 1,633

by 보일듯말듯 [SQL Query] [2015.07.10 15:43:51]


쿼리문

select a.reg_dt,   sum(cnt1) cnt1, sum(cnt2) cnt2, sum(cnt3) cnt3, sum(cnt4) cnt4
  FROM   
  ( SELECT reg_dt,  COUNT(*) cnt1,  0 cnt2, 0 cnt3, 0 cnt4 FROM FINE    
 where reg_id in ('000155','000096')  AND  substr(reg_dt, 1,4) = '2015' AND  to_number(substr(reg_dt, 5,2)) = '6'   and /*pol_sta  not in('278', '353', '455', '504', '389', '459', '486', '358', '347') AND*/ NVL(note,'-') not in ('한꺼번에 등록') AND NVL(note,'-') <> '경찰서 과태료 엑셀파일로 한꺼번에 등록'  GROUP BY reg_dt  
   union all 
   SELECT reg_dt,    0 cnt1, COUNT(*) cnt2, 0 cnt3, 0 cnt4  FROM FINE   
 where reg_id in ('000155','000096')  AND  substr(reg_dt, 1,4) = '2015' AND  to_number(substr(reg_dt, 5,2)) = '6'    and pol_sta  in('278', '353', '455', '504', '389', '459', '486', '358', '347') AND NVL(note,'-') in ('한꺼번에 등록')  GROUP BY reg_dt   
   union all 
   SELECT reg_dt,    0 cnt1, 0 cnt2, 0 cnt3, cnt cnt4  FROM FINE_EX   
 where reg_id in ('000155','000096')  AND  substr(reg_dt, 1,4) = '2015' AND  to_number(substr(reg_dt, 5,2)) = '6'    union all 
   SELECT reg_dt,    0 cnt1, 0 cnt3, COUNT(*) cnt3, 0 cnt4  FROM FINE   
 where reg_id in ('000155','000096')  AND  substr(reg_dt, 1,4) = '2015' AND  to_number(substr(reg_dt, 5,2)) = '6'    AND pol_sta <> '278' AND note ='경찰서 과태료 엑셀파일로 한꺼번에 등록'  GROUP BY reg_dt     ) a 
 group by a.reg_dt  
 ORDER BY a.reg_dt   

 

결과

REG_DT CNT1 CNT2 CNT3 CNT4
20150601 11 0 0 200
20150602 171 0 0 0
20150603 137 0 0 55
20150604 134 213 0 117
20150605 39 0 0 0
20150607 64 0 0 268
20150608 189 0 0 0
20150609 81 0 0 0
20150610 89 0 93 133
20150611 93 0 69 79
20150612 169 0 83 0
20150613 18 0 54 347
20150615 61 0 0 70
20150616 100 0 106 71
20150617 117 0 0 79
20150618 84 0 0 93
20150619 50 0 0 0
20150620 30 0 174 0
20150621 16 0 0 0
20150622 65 95 15 0
20150623 107 299 85 0
20150624 74 138 9 0
20150625 43 110 44 0
20150626 18 0 0 0
20150627 41 0 0 0
20150628 112 0 127 0
20150629 9 35 0 0
20150630 92 114 87 0

 

---------------------------------------------------------------------------------------------------------------------

현재 일자별로 리스트 현황을 보여주고 있습니다.

 

이걸 월별로 보여주려면 그룹을 어찌 잡아 줘야 하나요.??

 

Fine 라는 테이블에 데이터가 100개가 있다면

일부분은 cnt1, 일부는 cnt2 이렇게 묶어 줬습니다. 

 

원하는 결과화면은

행 레이블 합계 : CNT1 합계 : CNT2 합계 : CNT3 합계 : CNT4
201501 3312 0 0 2174
201502 2521 62 0 2488
201503 3578 110 0 2065
201504 3390 103 0 1772
201505 3382 0 0 2223
201506 2214 1004 946 1512
201507 239 539 228 0
총합계 18636 1818 1174 12234

입니다.

 

 

by 아발란체 [2015.07.10 15:51:05]
--샘플 데이타는 6월 것만 있네요 ~ ^.^ 
--해당 풀이는 기본 GROUP BY로 풀 수 있는 부분 같습니다.

WITH T(REG_DT, CNT1, CNT2, CNT3, CNT4) AS (
 SELECT 20150601, 11, 0, 0, 200 FROM DUAL UNION ALL
 SELECT 20150602, 171, 0, 0, 0 FROM DUAL UNION ALL
 SELECT 20150603, 137, 0, 0, 55 FROM DUAL UNION ALL
 SELECT 20150604, 134, 213, 0, 117 FROM DUAL UNION ALL
 SELECT 20150605, 39, 0, 0, 0 FROM DUAL UNION ALL
 SELECT 20150607, 64, 0, 0, 268 FROM DUAL UNION ALL
 SELECT 20150608, 189, 0, 0, 0 FROM DUAL UNION ALL
 SELECT 20150609, 81, 0, 0, 0 FROM DUAL UNION ALL
 SELECT 20150610, 89, 0, 93, 133 FROM DUAL UNION ALL
 SELECT 20150611, 93, 0, 69, 79 FROM DUAL UNION ALL
 SELECT 20150612, 169, 0, 83, 0 FROM DUAL UNION ALL
 SELECT 20150613, 18, 0, 54, 347 FROM DUAL UNION ALL
 SELECT 20150615, 61, 0, 0, 70 FROM DUAL UNION ALL
 SELECT 20150616, 100, 0, 106, 71 FROM DUAL UNION ALL
 SELECT 20150617, 117, 0, 0, 79 FROM DUAL UNION ALL
 SELECT 20150618, 84, 0, 0, 93 FROM DUAL UNION ALL
 SELECT 20150619, 50, 0, 0, 0 FROM DUAL UNION ALL
 SELECT 20150620, 30, 0, 174, 0 FROM DUAL UNION ALL
 SELECT 20150621, 16, 0, 0, 0 FROM DUAL UNION ALL
 SELECT 20150622, 65, 95, 15, 0 FROM DUAL UNION ALL
 SELECT 20150623, 107, 299, 85, 0 FROM DUAL UNION ALL
 SELECT 20150624, 74, 138, 9, 0 FROM DUAL UNION ALL
 SELECT 20150625, 43, 110, 44, 0 FROM DUAL UNION ALL
 SELECT 20150626, 18, 0, 0, 0 FROM DUAL UNION ALL
 SELECT 20150627, 41, 0, 0, 0 FROM DUAL UNION ALL
 SELECT 20150628, 112, 0, 127, 0 FROM DUAL UNION ALL
 Select 20150629, 9, 35, 0, 0 From Dual Union All
 Select 20150630, 92, 114, 87, 0 From Dual Union All
  Select 20150701, 9, 35, 0, 0 From Dual Union All
 SELECT 201500802, 92, 114, 87, 0 FROM DUAL 
)
Select
  SUBSTR(REG_DT, 1, 6), SUM(CNT1), SUM(CNT2), SUM(CNT3), SUM(CNT4)
From
  T
Group By 
  SUBSTR(REG_DT, 1, 6)
  

 


by 보일듯말듯 [2015.07.10 16:28:37]

답변 감사드립니다.

우선 결과로 보여드린 데이터는 이미 쿼리를 실행한 후의 결과입니다. ^^;;

실제 데이터는 아래와 같습니다.

VIO_DT VIO_PLA VIO_CONT PAID_AMT POL_STA PAID_NO NOTE REG_ID REG_DT
201506040554 번영로 문현고가 부두로방면(문현터널→5부 속도(제한:60 주행:77 초과:17) 32000 302 131170150350657 경찰서 과태료 엑셀파일로 한꺼번에 등록 000096 20150610
201506020609 용인시 처인구 양지면 제일초등학교입구사 속도(제한:80 주행:92 초과:12) 32000 302 131170150347163 경찰서 과태료 엑셀파일로 한꺼번에 등록 000096 20150610
201506011023 마산합포 진북 대평교차로ㅡ고성방향 속도(제한:80 주행:95 초과:15) 32000 411 230770151095633 경찰서 과태료 엑셀파일로 한꺼번에 등록 000096 20150610
201505101037 서초2동 서2치안센터주변 주정차 40000 100 201505101037   000155 20150610
201505191831 동소문동 4가 동소문로 13가길 58 주정차 40000 102 201505191831324   000155 20150610
201505222113 명일동 동남로 75길 주정차 40000 086 201505222113   000155 20150610
201506020824 용인시 기흥구 마북동 마북터널앞(용인->수 속도(제한:70 주행:83 초과:13) 32000 411 230770151091300 경찰서 과태료 엑셀파일로 한꺼번에 등록 000096 20150610
201506011810 평택-제천 고속도로 21.5km 지점(음성->평 속도(제한:100 주행:118 초과:18) 32000 302 131170150351504 경찰서 과태료 엑셀파일로 한꺼번에 등록 000096 20150610

by 마농 [2015.07.10 16:15:07]

1. 조건이 다르다고 개별 쿼리로 하실 필요는 없습니다.
   공통 조건은 Where 절에, 개별 조건은 Case 문으로 하여
   하나의 쿼리에서 Group By Count 하시면 됩니다.
   총합계도 필요하면 Rollup 이용
2. 불필요한 함수 사용을 줄이세요.
   널이 존재한다고 해서 무조건 NVL 해야 하는 것은 아닙니다.
3. 컬럼을 가공하여 비교하기 보다는(AND SUBSTR(reg_dt, 1, 4) = '2015')
   조건을 가공하여 비교하세요(AND reg_dt LIKE '2015%')

SELECT NVL(SUBSTR(reg_dt, 1, 6), '총합계') reg_ym
     , COUNT(CASE WHEN NVL(note, '-') NOT IN ( '한꺼번에 등록'
                                             , '경찰서 과태료 엑셀파일로 한꺼번에 등록')
            /* AND pol_sta NOT IN ('278','353','455','504','389','459','486','358','347') */
                  THEN 1 END) cnt1
     , COUNT(CASE WHEN note = '한꺼번에 등록'
                   AND pol_sta IN ('278','353','455','504','389','459','486','358','347')
                  THEN 1 END) cnt2
     , COUNT(CASE WHEN note = '경찰서 과태료 엑셀파일로 한꺼번에 등록'
                   AND pol_sta <> '278'
                  THEN 1 END) cnt3
     , SUM(cnt) cnt4
  FROM fine
 WHERE reg_id IN ('000155', '000096')
   AND reg_dt LIKE '2015%'
 GROUP BY ROLLUP(SUBSTR(reg_dt, 1, 6))
;

 


by 보일듯말듯 [2015.07.10 17:29:35]

답변 감사드립니다.

 

한번 해보겠습니다.

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