Or06GroupBy

/*******

# 파일명 : Or06GroupBy.sql

# 그룹함수(select문 2번째)

# 설명 : 전체 레코드에서 통계적인 결과를 구하기 위해 하나 이상의 행을

묶어서 연산후 결과를 반환하는 함수

*******/


/*

    쿼리문의 기본형식 : [](대괄호) 부분은 생략이 가능하고,

    생략할 경우 테이블에 저장된 모든 레코드를 가져온다.

    

        select

            칼럼1, 칼럼2, .... , 칼럼N

        from

            테이블명

        [where

            조건1, 조건2, ... , 조건N]

        [group by 데이터 그룹화를 위한 칼럼명]

        [having 구룹에서 찾는 조건]

        [order by 데이터 정렬방식]

    

    쿼리의 실행순서 :

        from -> where -> group by -> having -> select -> order by

*/


/*

    sum()

    : 합계를 구할 때 사용하는 함수

    사용법 : sum(칼럼명)

    필드명이 필요한 경우 AS를 이용해서 명칭 사용함.

*/


select * from employees; --전체레코드 확인


-- 전체 직원의 급여의 합계 출력

select

    sum(salary) AS "SalarySum",

    to_char(sum(salary), '$999,990,000') AS "SalaryTotal"

from employees

where department_id=10;


--sum()과 같은 함수는 숫자 타입의 칼럼에서만 사용가능함.

select sum(first_name) from employees; -- 쿼리에러 : Invaild number


/*

    count()

    : 레코드의 갯수를 카운트할 때 사용하는 함수

*/


select * from employees;


/*

count()

    : 레코드의 갯수를 카운트할 때 사용하는 함수

*/

select * from employees;

select count(*) as"사원테이블의레코드수" from employees;


select count(job_id) from employees; -- 특정 칼럼명 사용


/*

    count(all 칼럼명) : 칼럼 전체 레코드를 기준으로 카운트함

    count(distinct 칼럼명) : 중복을 제거한 상태에서의 카운트함.

*/


select

    count(all job_id) "전체",

    count(distinct job_id) "중복제거"

from employees; --실행결과 : 107개 19개


select * from employees order by first_name asc;

select

    count(first_name),

    count(distinct first_name)

from employees;


/*

    avg()

    : 평균값을 구할 때 사용하는 함수

    사용법 : avg(칼럼명)

*/


-- 전체 사원의 평균 급여는 얼마인가?

select 

    sum(salary) "급여의 합계",

    count(first_name) "전체 직원 수",

    round(sum(salary)/count(first_name)) "평균 급여1",

    to_char(avg(salary), '99900.00') "평균급여2"

from employees;


-- 영업팀의 평균 급여는 얼마인가?

select * from department;   -- 부서명 확인 : 영업팀의 부서번호는 80

select 

    to_char(avg(salary), '$999,000.00') as "영업팀 평균 급여"

from employees

where department_id = 80;


/*

max(), min()

    : 최대값, 최소값을 찾을 때 사용하는 함수

*/

-- 사원중 급여가 가장 높은 사람은 누구인가?(서브쿼리를 통해서 해결해야 한다.)

-- 사원중 가장 높은 급여는 얼마인가?

select max(salary) from employees;


-- 사원중 급여가 가장 적은 사람은 누구인가?(서브쿼리를 통해서 해결해야 한다.)

-- 사원중 가장 적은 급여는 얼마인가?

select min(salary) from employees;


/*

    group by : 여러 개의 레코드를 하나의 그룹으로 그룹화하여 묶여진 결과를

    반환함

        주의) distinct와 group by의 차이점

        아래 쿼리의 결과는 동일한 것처럼 보이나 내부적으로는 전혀 다른 결과이다.

        distinct는 중복이 제거된 순수한 하나의 레코드가 출력되는 것이고

        group by는 여러개의 데이터가 하나의 레코드로 합쳐진 결과가 출력된다.

*/

select department_id from employees group by department_id;

select distinct department_id from employees;


/*

    부서별 급여의 합계는 얼마인가? group by 사용

*/


select department_id, sum(salary) "부서급여합계"

from employees

group by department_id;


/*

    부서별 급여의 합계를 distinct를 사용해서 쿼리 작성(znjfl dpfjqkftod)

    ORA-00937: 단일 그룹의 그룹 함수가 아닙니다

    00937. 00000 -  "not a single-group group function"

*/

select distinct department_id, sum(salary) "부서급여의합계"

from employees;


/*

    문제] 부서별 사원수와 평균급여는 얼마인가요?

    출력결과 ) 부서번호, 급여총합, 사원수, 평균급여

*/

select * from employees;


/* 내가 푼것... 단일 그룹의 그룹함수가 아니라고 에러남.

select

    distinct department_id "부서번호",

    sum(salary) "급여의 합계",

    count(first_name) "사원수",

    avg(sum(salary)) "평균"

from employees

group by department_id;

*/


select

    

    department_id as "부서번호",

    sum(salary) as "급여총합",

    count(salary) as "사원수",

    to_char(avg(salary), '$999,999,99')as "평균급여"

from employees

group by department_id

order by department_id;

/*

    주의]department_id로 group by를 걸었다면 해당 칼럼을 통해서만

    정렬(order by)이 가능하고, select절에 표현하는 것도

    해당 칼럼만 가능하다.

    만약 그룹과 상관없는 칼럼을 사용하게 되면 아래와 같은 에러가 발생

    

    ORA-00979: GROUP BY 표현식이 아닙니다.

    00979. 00000 -  "not a GROUP BY expression"

*/




select 

    sum(salary) "급여의 합계",

    count(first_name) "전체 직원 수",

    round(sum(salary)/count(first_name)) "평균 급여1",

    to_char(avg(salary), '99900.00') "평균급여2"

from employees;







'프로그래밍 > Oracle' 카테고리의 다른 글

Or09DDL  (0) 2017.11.15
Or07Join  (0) 2017.11.15
Or05Date  (0) 2017.11.15
Or04TypeConvert  (0) 2017.11.15
Or03String  (0) 2017.11.15
TAGS.

Comments