aggregation_function.sql

성혜·2024년 2월 14일
0

Oracle

목록 보기
7/26
post-thumbnail

집계 함수, Aggregation Function

: Java의 count(), sun(), max(), min(), average() 와 동일한 기능

  1. count()
  2. sum()
  3. avg()
  4. max()
  5. min()

count()

- 결과 테이블의 레코드 수를 반환한다.
- number count(컬럼명)
- null 값은 제외한다.(***) 주의!!

  • 실습 코드
select * from tblCountry; --컬럼속 데이터가 모두 null일땐 제외, 아니면 다 가져옴

📌count(*) = 14개 하지만 count(population) = 13개
: null 값 제외!!

-- 모든 직원수?
select count(*) from tblInsa; --60

-- 연락처가 있는 직원수
select * from tblInsa where tel is not null; --57
select count(tel) from tblInsa; --57
select count(*) from tblInsa where tel is not null; --57

-- 연락처가 없는 직원수 
select * from tblInsa where tel is null; --3
select count(*) from tblInsa where tel is null; --3

-- 연락처가 없는 직원수 : 전체 직원수 - 연락처가 있는 직원수
select count(*) - count(tel) from tblInsa; --3 
-- 남자수와 여자수를 1개의 테이블로 가져오시오 ***** 자주 사용되는 패턴
select 
    count(case
        when gender = 'm' then 1
    end) AS 남자인원수,  
    count(case
        when gender = 'f' then 1
    end) AS 여자인원수
from tblComedian;



sum()

- 해당 컬럼의 합을 구한다.
- number sum(컬럼명)
- 숫자형 적용 가능 (날짜나 문자열 적용x)

  • 실습 코드
select 
    sum(basicpay) as "지출 급여 합",
    sum(sudang) as "지출 수당 합",
    sum(basicpay) +  sum(sudang) as "총 지출",
    sum(basicpay + sudang) as "총 지출"
from tblInsa;



avg

- 해당 컬럼의 평균값을 구한다.
- number avg(컬럼명)
- 숫자형 적용 가능 
- 합 / 레코드 수 > null 제외

  • 실습 코드
-- tblInsa. 평균 급여 ?
select sum(basicpay) / 60 from tblInsa; -- 1556526
select sum(basicpay) / count(*) from tblInsa; -- 1556526
select avg(basicpay) from tblInsa; --1556526
-- tblCountry. 평균 인구수?
select sum(population) / 14 from tblCountry; -- 14475
select sum(population) / count(*) from tblCountry; -- 14475
select avg(population) from tblCountry; -- 15588 null값 문제
select count(population) from tblCountry; --13

📌 avg는 null 제외 하기 때문에 주의하기!

예를 들어

회사 > 성과급 지급 > 출처 > 1팀 공로!!
1. 균등 지급 > 총지급액 / 모든 직원수 = sum() / count(*)
2. 차등 지급 > 총지급액 / 1팀 직원수 = sum() / count(1팀) = avg()



max()

- object max(컬럼명)
- 최댓값 반환

min()

- object min(컬럼명)
- 최댓값 반환

💡object = 숫자형, 문자형, 날짜형 모두 적용 가능 (oracle에는 object 자료형 없음, 임시로 표현)


  • 실습 코드
select max(basicpay), min(basicpay) from tblInsa; -- 숫자형
select max(name), min(name) from tblInsa; --문자코드값 기준 , 문자형
select max(ibsadate), min(ibsadate) from tblInsa; -- 날짜형
select 
    count(*) as 직원수,
    sum(basicpay) as 총급여합,
    avg(basicpay) as 평균급여,
    max(basicpay) as 최고급여,
    min(basicpay) as 최저급여
from tblInsa;



📌 집계 함수 사용시 주의점 !!
1. ORA-00937: 단일 그룹의 그룹 함수가 아닙니다/ "not a single-group group function"
: 컬럼 리스트에서는 집계함수와 일반컬럼을 동시에 사용할 수 없다.

select name, count(*) from tblInsa; --name : 일반컬럼 / count(*) : 집계함수

2. ORA-00934: 그룹 함수는 허가되지 않습니다 / "group function is not allowed here"
: where절에는 집계 함수를 사용할 수 없다.
: where절 > 개인(레코드)에 대한 조건절

select * from tblInsa where basicpay >= avg(basicpay);
profile
하루를 정리하고 기록합니다.

0개의 댓글