왕초보 sql count 함수 질문드립니다! 0 8 1,439

by qqq [SQL Query] sql query [2022.08.24 15:05:26]


  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)
당췌 어떤식으로 쿼리를 생성해야하는지 감이 안옵니다..

찾아봐도 비슷한 유형의 설명이 없어 고수님들의 조언을 받으려합니다!!

by jkson [2022.08.24 15:58:07]
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

오랜만에 쿼리 만드려니까 함수도 제대로 생각 안 나고.. ㅎ


by qqq [2022.08.24 18:09:19]

답변 감사드립니다!!

그러나 갑/을 , ㄱ/ㄴ/ㄷ 는 일련의 예시이고 실제 데이터양이 방대해서 일일이 기재해 줄 수 가 없습니다..

혹 일일이 기재하지 않는 다른 방안이 있으시다면 추가 답변 부탁드리겠습니다ㅠㅠ!!


by 마농 [2022.08.24 17:02:02]
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
;

 


by qqq [2022.08.24 18:09:25]

답변 감사드립니다!!

그러나 갑/을 , ㄱ/ㄴ/ㄷ 는 일련의 예시이고 실제 데이터양이 방대해서 일일이 기재해 줄 수 가 없습니다..

혹 일일이 기재하지 않는 다른 방안이 있으시다면 추가 답변 부탁드리겠습니다ㅠㅠ!!

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

감사합니다! WITH절 무시하고 아래쿼리만 참고하여 해결하였습니다~!! 


by pajama [2022.08.24 18:24:33]

어..답변주신 두분 아래 쿼리만 보시면 됩니다~

WITH 절은 보여주신 샘플 데이터를 사용하기 위한거구요~


by 마농 [2022.08.24 21:16:49]

WITH 는 테스트 용도로 사용했을 뿐입니다.
일일이 다 적어 주라는 의미가 아닙니다.
WITH 문 없다고 생각하시고 SELECT 구문이 어떤 방식으로 작성되었는지를 보세요.


by 창조의날개 [2022.08.25 11:47:20]

B컬럼의 값은 에러인경우 중복될수 있지만 에러가 아닌경우 중복되지 않고

C컬럼은 에러인경우만 문자가 있고 에러 아니면 NULL이라는 전제 입니다.

SELECT A
        , COUNT(C) 에러건수
        , COUNT(DISTINCT B) 데이터건수
FROM 테이블명
GROUP BY A
;

by qqq [2022.08.29 13:37:00]

댓글달아주신 모든분들께 감사드립니다~~

세상에는 정말 뛰어나신 분들이 많네요... 답변주신 모든 내용들이 큰 도움이 되었습니다!!

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