오라클 COUNT 조건 - olakeul COUNT jogeon

오라클 COUNT 조건 - olakeul COUNT jogeon

오라클에서 집계함수인 COUNT()를 사용하는 방법입니다.

SELECT
    COUNT(CASE WHEN CRSE_TY = '0' THEN 1 END)
FROM DUAL

# 예시

오라클 COUNT 조건 - olakeul COUNT jogeon
예제의 사용된 테이블

테이블의 데이터는 위 이미지보다 더 많습니다.

SELECT
     COUNT(CASE WHEN CRSE_TY = '0' THEN 1 END) AS CRSE_TY_ELRN
    ,COUNT(CASE WHEN CRSE_TY = '1' THEN 1 END) AS CRSE_TY_OFL
    ,COUNT(CASE WHEN CRSE_TY = '2' THEN 1 END) AS CRSE_TY_BLEND
FROM CRSE_MASTR
WHERE EDC_TY = '001'

CASE WHEN을 사용하여 집계할 컬럼의 조건을 걸어주고 THEN을 사용하여 일치할 때 1을 더해줍니다.

오라클 COUNT 조건 - olakeul COUNT jogeon
쿼리문 결과

이번 글에서는 COUNT()를 이용하여 데이터를 집계해보았습니다.

'Database > Oracle' 카테고리의 다른 글

[Oracle] Listener refused the connection with the following error  (0) 2021.01.26
[Oracle] 조회 순번 매기기 ROW_NUMBER()  (0) 2021.01.26
[Oracle] 오라클 seq 최대값 구하기  (0) 2021.01.08

조회 된 데이터 내 CODE_VAL 의 값이 2인 경우의 카운트 값을 가져오기 위해 사용한 쿼리.

Oracle [ Count 함수, Decode 함수 사용 ]

COUNT(DECODE(컬럼명, 조건, '참일때','거짓일때'))

     SELECT COUNT(DECODE(CODE_VAL,'2','1')) TRANS_S_COUNT, COUNT(DECODE(CODE_VAL,'3','1')) TRANS_C_COUNT FROM     (     SELECT A.TRANS_NO, A.REG_USER_NO, A.GOODS_AMT, B.CODE_VAL FROM TB_TRANS A, TB_COMMON_CODE B      WHERE A.TRANS_ST = B.CODE_VAL AND B.TARGET_TBL='TB_TRANS'      AND B.TARGET_COL='TRANS_ST' AND A.DEL_YN <> 'Y'     )A     INNER JOIN      (     SELECT USER_ID, USER_NO FROM TB_USER     WHERE USER_ID = 'kang'     )B     ON A.REG_USER_NO = B.USER_NO; 

SELECT Count(Decode(code_val, '2', '1')) TRANS_S_COUNT,
       Count(Decode(code_val, '3', '1')) TRANS_C_COUNT
  FROM   (SELECT A.trans_no,
                 A.reg_user_no,
                 A.goods_amt,
                 B.code_val
            FROM tb_trans A,
                 tb_common_code B
           WHERE A.trans_st = B.code_val
             AND B.target_tbl = 'TB_TRANS'
             AND B.target_col = 'TRANS_ST'
             AND A.del_yn <> 'Y')A
      INNER JOIN (SELECT user_id
                         , user_no
                   FROM tb_user
                  WHERE user_id = 'kang') B
              ON A.reg_user_no = B.user_no;      

Oracle, MySQL, MSSQL, ProstgresSQL 모두 적용 가능 [ CASE WHEN THEN ELSE END ]

CASE WHEN 조건 THEN '대체값' ELSE '기본값' END

     SELECT COUNT(CASE WHEN CODE_VAL='2' THEN '1' END) 
       FROM ( SELECT A.TRANS_NO
                         , A.REG_USER_NO
                       , A.GOODS_AMT
                       , B.CODE_VAL FROM TB_TRANS A
                       , TB_COMMON_CODE B
                 WHERE A.TRANS_ST = B.CODE_VAL 
                   AND B.TARGET_TBL='TB_TRANS'
                   AND B.TARGET_COL='TRANS_ST'
                   AND A.DEL_YN <> 'Y' )A
 INNER JOIN ( SELECT USER_ID
                     , USER_NO 
                FROM TB_USER
               WHERE USER_ID = 'kang'  )B     
         ON A.REG_USER_NO = B.USER_NO;     

오라클 COUNT 조건 - olakeul COUNT jogeon

COUNT CASE, COUNT DISTINCT

조건에 따른 카운트 및 중복을 제거한 카운트를 세보자

COUNT CASE (조건 카운트)

특정 조건에 해당하는 행의 카운트를 세보자

SELECT COUNT(CASE WHEN 조건 THEN 1 END)
FROM 테이블

조건에 일치할 경우 카운트하고, 일치하지 않을 경우 카운트하지 않는다.

예제. 반별 학생 수 카운트

반을 기준으로 반별로 학생의 수를 카운트해보자

WITH TABLE1 (반, 이름) AS
(
	SELECT 1, '꽁쥐'
	UNION ALL SELECT 1, '박사'
	UNION ALL SELECT 2, '찌우'
	UNION ALL SELECT 2, '소태'
	UNION ALL SELECT 2, '소희'
	UNION ALL SELECT 3, '현정'
	UNION ALL SELECT 3, '태희'
)
SELECT  COUNT(CASE WHEN 반=1 THEN 1 END) AS '1반',
	COUNT(CASE WHEN 반=2 THEN 1 END) AS '2반',
	COUNT(CASE WHEN 반=3 THEN 1 END) AS '3반'
FROM TABLE1
원본 데이터
오라클 COUNT 조건 - olakeul COUNT jogeon
결과 데이터

1반에 해당하는 '꽁쥐','박사' -> 2명

2반에 해당하는 '찌우', '소태', '소희' -> 3명

3반에 해당하는 '현정', '태희' -> 2명

의 결과를 가져온다.

위와 같은 경우는 COUNT CASE가 아니라 간단히 GROUP BY를 사용해서 표현할수도 있다.

WITH TABLE1 (반, 이름) AS
(
	SELECT 1, '꽁쥐'
	UNION ALL SELECT 1, '박사'
	UNION ALL SELECT 2, '찌우'
	UNION ALL SELECT 2, '소태'
	UNION ALL SELECT 2, '소희'
	UNION ALL SELECT 3, '현정'
	UNION ALL SELECT 3, '태희'
)
SELECT 반, COUNT(*) AS ' 카운트'
FROM TABLE1
GROUP BY 반
결과 데이터

CASE DISTINCT (중복제거 카운트)

중복된 값을 제거하고 카운트해보자

SELECT COUNT(DISTINCT 컬럼명)
FROM 테이블

값의 중복이 있을 경우 중복을 제거하여 무조건 하나로 카운트한다.

예제. 중복을 제거한 반별 학생 수 카운트

학생 수를 반별로 카운트하되, 중복을 제거하고 카운트해보자

WITH TABLE1(반, 이름) AS (
	SELECT 1, '꽁쥐' UNION ALL
	SELECT 1, '꽁쥐' UNION ALL
	SELECT 1, '꽁쥐' UNION ALL
	SELECT 2, '소태' UNION ALL
	SELECT 2, '룰라' UNION ALL
	SELECT 3, '소희' UNION ALL
	SELECT 3, '소희'
)
SELECT 반
	, COUNT(*) AS '중복포함'
	, COUNT(DISTINCT 이름) AS '중복제거'
FROM TABLE1
GROUP BY 반
원본 데이터결과 데이터

1반의 꽁쥐의 데이터는 3개가 있다. COUNT(*) -> 3

하지만, DISTINCT로 중복을 제거하면 하나로 카운트한다. COUNT(DISTINCT 이름) -> 1

[MSSQL] GROUP BY 없이 컬럼과 함께 COUNT를 조회해보자 (COUNT OVER)
[MSSQL] COUNT(*) COUNT(1), COUNT(컬럼명)
[MSSQL] DISTINCT, GROUP BY 비교