명령어의 처리순서 (Group by )

양혜정·2024년 2월 24일

Oracle

목록 보기
11/49

테이블에서 데이터 정보를 꺼낼 때,

명령어의 처리순서

--------------------------------------------------
select 컬럼명1, 컬럼명2		-> 5 번
from 테이블명 (또는 뷰명)		-> 1 번
where 조건절					-> 2 번
// where 조건절 : 조건에 만족하는 테이블의 행(row)를 
// 			메모리(RAM)에 로딩해주는 것
group by 절					-> 3 번
having 그룹함수조건절			-> 4 번
order by 절 				-> 6 번
--------------------------------------------------

Group by 절

  • 컬럼의 값이 같은 것 끼리 그룹을 짓는 것

1차그룹, 2차그룹

-> 1차그룹지어진 사람들 가지고 2차그룹짓기

SELECT department_id as 부서번호
	, gender as 성별
    , count(*) as 인원수
FROM
(
	select department_id
    	, case when substr(jubun,7,1) in('1','3')
        	then '남' else '여' end as gender
    from employees
) V
GROUP BY department_id, gender
order by 1;

rollup, cube

rollup(컬럼명), cube(컬럼명)

  • 항상 group by 와 사용된다.

  • grouping 유무 판별
    -> grouping(컬럼명)
    group 되어있으면 1, group 이 아니면 0
    group 이 아닌 것 전체를 뜻한다.

SELECT decode (grouping(department_id), 0
	, nvl(to_char(department_id),'부서없음'), '전체' ) 
    as 부서번호
-- 또는
/*
 	case grouping(department_id) 
 	when 0 then nvl(to_char(department_id),'부서없음')
 	else '전체' end as 부서번호
*/
    , decode (grouping(gender),0,gender,'전체') as 성별
    , count(*) as 인원수
    , to_char(round( 
    COUNT(*)/( select count(*) from employees )*100, 1)
    							,'990.0') as "퍼센티지(%)"
FROM
(
    select department_id
        , case when substr(jubun,7,1) in('1','3') 
        then '남' else '여' end as gender
    from employees
) V
GROUP BY rollup(department_id, gender)
-- rollup 시, 10~110 부서, 부서전체, 남녀, 부서별 남녀전체
-- cube 시 , 10~110 부서, 부서전체, 남녀, 부서별 남녀전체
-- 		, 총 남녀전체
ORDER BY department_id,1,2;
-- 부서번호(숫자)정렬
-- 1은 grouping(department_id)의 값을 정렬 0과 1 (null 값 정렬)
-- 2는 gender 정렬

grouping sets

  • rollup 보다 grouping sets 를 더 많이 사용한다.
  1. rollup(a,b,c) 는
    grouping sets((a,b,c), (a,b), (a,c), (b,c), (a) () ) 와 같다.
  2. cube(a,b,c) 는
    grouping sets((a,b,c), (a,b), (a,c), (b,c), (a), (b), (c), () 와 같다.

listagg

listagg(보여줄컬럼명,'구분자') within group(order by 보여줄 컬럼명의 정렬기준 asc/desc)

  • 그룹화 데이터를 하나의 열에 가로로 나열하여 출력
select department_id as 부서번호
	, listagg(first_name || ' ' || last_name, ',')
    -- 구분자 ','
    within group(
    order by nvl(salary + (salary * commission_pct), salary)
    desc) as "급여가 많은 순서대로 사원명 출력"
from employees
group by department_id;

참고

case when then else end, decode
: https://velog.io/@jjoung-2j/%EB%8B%A8%EC%9D%BC%ED%96%89-%ED%95%A8%EC%88%98-%EA%B8%B0%ED%83%80-%ED%95%A8%EC%88%98


정리

-> local_hr에서작업한것

0개의 댓글