쿼리문
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 |
입니다.
--샘플 데이타는 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)
답변 감사드립니다.
우선 결과로 보여드린 데이터는 이미 쿼리를 실행한 후의 결과입니다. ^^;;
실제 데이터는 아래와 같습니다.
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 |
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)) ;