기록

*35일차 (2) 본문

학원/강의

*35일차 (2)

pringspring 2022. 3. 16. 22:50

@DQL2

 

*GROUP BY

  • 별도의 그룹지정이 없다면 그룹함수는 전체를 하나의 그룹으로 간주한다.
  • 세부적 그룹지정을 group by절을 이용할 수 있다.
-- 부서별 급여 평균
select
    dept_code, 
    avg(salary)
from
    employee
group by
    dept_code
order by 
    dept_code;

-- 부서별 사원수를 조회
-- from - where - group by - having - select - order by
select
    nvl(dept_code, '인턴') dept_code,
    count(*)
from
    employee
group by 
    dept_code
order by
    1;

-- 성별 사원수를 조회
-- 가상컬럼을 기준 그룹핑 가능
select 
    employee.*,
    decode(substr(emp_no, 8, 1), '1', '남', '3', '남', '여') 성별
from 
    employee;
    
select
    decode(substr(emp_no, 8, 1), '1', '남', '3', '남', '여') 성별, 
    count(*) 사원수
from 
    employee
group by
    decode(substr(emp_no, 8, 1), '1', '남', '3', '남', '여');
    
-- 부서별 직급별 인원수    
select
    dept_code, 
    job_code,
    count(*)
from
    employee
group by
    dept_code, job_code
order by 
    1, 2;

-- 부서별 성별 인원수

select
    nvl(dept_code, '인턴') dept_code, 
    decode(substr(emp_no, 8, 1), '1', '남', '3', '남', '여') gender,
    count(*)
from
    employee
group by
    dept_code, decode(substr(emp_no, 8, 1), '1', '남', '3', '남', '여')
order by 
    dept_code, gender;

 

 

*HAVING

  • grouping한 결과행에 대해 조건절을 작성
-- 부서별 급여평균이 300만원 이상이 부서들만 조회(부서명, 급여평균)
select
    dept_code,
    avg(salary)
from
    employee
group by
    dept_code
having
    avg(salary) >= 3000000;


-- 사원테이블에서 J3직급을 제외하고, 직급별 인원수가 3명이상인 직급의 정보를 조회(직급코드, 인원수, 급여평균)
select
    job_code,
    count(*),
    trunc(avg(salary))
from
    employee
where
    job_code != 'J3'
group by
    job_code
having
    count(*) >= 3
order by
    1;
--관리하는 사원이 2명이상인 매니져의 사원아이디와 관리하는 사원수를 출력하세요.
select
    manager_id,
    count(*)
from
    employee
where
    manager_id is not null
group by
    manager_id
having 
    count(*) >= 2;
    
select
    manager_id,
    count(*)
from
    employee
group by
    manager_id
having 
    count(manager_id) >= 2;
    
-- 소계를 처리하는 rollup 
select
    nvl(job_code, '소계'),
    count(*)
from
    employee
group by
    rollup(job_code)
order by 
    job_code;
    

select
--    dept_code,
--    grouping(dept_code), -- 0이면 실제 데이터, 1이면 rollup에 의해 생성된 데이터
    decode(grouping(dept_code), 0, nvl(dept_code, '인턴'), 1, '총계') dept_code,
    count(*)
from
    employee
group by
    rollup(dept_code)
order by
    dept_code;
    

select
    decode(grouping(dept_code), 0, nvl(dept_code, '인턴'), 1, '총계') dept_code, 
    decode(grouping(job_code), 0, job_code, 1, '소계') job_code,
    count(*)
from
    employee
group by
    rollup(dept_code, job_code)
order by
    dept_code, job_code;