A | B | C | |
1 | 갑 | ㄱ | err |
2 | 갑 | ㄱ | |
3 | 갑 | ㄴ | |
4 | 을 | ㄴ | |
5 | 을 | ㄴ | err |
6 | 을 | ㄷ |
해당 데이터에서 아래의 통계를 추출하기 위해
전체건수 | 에러건수 | err를 포함하는 B칼럼 데이터건수 | |
갑 | 3 | 1 | 2 |
을 | 3 | 1 | 2 |
=> select
count(*) as 전체건수
count(case when C = 'err' then A end) as 에러건수
from schema_name.table_name
group by A ;
이러한 쿼리를 사용했습니다.
갑/을 두 그룹의 전체데이터 건수와 err라는 문자가 포함된 데이터건수를 찾는 건 알겠는데,
문제는 C컬럼에 err라는 문자가 있으면 B칼럼에서 동명의 데이터의 합산을 얻고싶은데, (즉 갑 그룹에 err라는 문자가 B컬럼에서 'ㄱ'데이터에 해당하므로 갑 그룹에서 추출되는 값 => 2)
당췌 어떤식으로 쿼리를 생성해야하는지 감이 안옵니다..
찾아봐도 비슷한 유형의 설명이 없어 고수님들의 조언을 받으려합니다!!
with t(a, b, c) as ( select '갑', 'ㄱ', 'err' from dual union all select '갑', 'ㄱ', '' from dual union all select '갑', 'ㄴ', '' from dual union all select '을', 'ㄴ', '' from dual union all select '을', 'ㄴ', 'err' from dual union all select '을', 'ㄱ', '' from dual ) select a ,sum(cnt) as totcnt ,sum(errcnt) as errcnt ,sum(case when errcnt > 0 then cnt else 0 end) as exerr from ( select a ,b ,count(*) as cnt ,count(case when c = 'err' then a end) as errcnt from t group by a, b ) group by a order by a
오랜만에 쿼리 만드려니까 함수도 제대로 생각 안 나고.. ㅎ
WITH t AS ( SELECT '갑' a, 'ㄱ' b, 'err' c FROM dual UNION ALL SELECT '갑', 'ㄱ', null FROM dual UNION ALL SELECT '갑', 'ㄴ', null FROM dual UNION ALL SELECT '을', 'ㄴ', null FROM dual UNION ALL SELECT '을', 'ㄴ', 'err' FROM dual UNION ALL SELECT '을', 'ㄱ', null FROM dual ) SELECT a , COUNT(*) cnt_all , COUNT(c) cnt_err , COUNT(d) cnt_err_b FROM (SELECT a, b, c , MIN(c) OVER(PARTITION BY a, b) d FROM t ) GROUP BY a ;