group by.sql

성혜·2024년 2월 18일
0

Oracle

목록 보기
15/26
post-thumbnail

group by절

: 특정 기준으로 레코드를 그룹으로 나눈다.(수단) > 각각의 그룹을 대상으로 집계 함수를 실행한다.(목적)

    [WITH <Sub Query>]
    SELECT column_list
    FROM table_name
    [WHERE search_condition]
    [GROUP BY group_by_expression]
    [HAVING search_condition] - group by랑 무조건 같이 쓰기
    [ORDER BY order_expression [ASC|DESC]]
    
    SELECT 컬럼리스트  4. 컬럼 지정 (보고 싶은 컬럼만 가져오기) > Projection
    FROM 테이블        1. 테이블 지정
    WHERE 검색조건     2. 조건 지정 (보고 싶은 행만 가져오기) > Selection
    GROUP BY 그룹기준  3. 그룹을 나눈다. 
    ORDER BY 정렬기준; 5. 정렬해서 

  • 실습 코드
select 
    buseo,
    round(avg(basicpay)) as "부서별 평균 급여",
    count(*) as "부서별 인원수",
    sum(basicpay) as "부서별 총지급액",
    max(basicpay) as "부서별 최고급여",
    min(basicpay) as "부서별 최저급여"
from tblInsa
    group by buseo;

-- 남자수? 여자수?
select * from tblComedian;

-- 컬럼값으로 보여줌
select 
    count(decode(gender, 'm', 1)) as 남자수,
    count(decode(gender, 'f', 2)) as 여자수
from tblComedian;  

-- 행으로 보여줌
select 
    gender,
    count(*)
from tblComedian
    group by gender;
컬럼값
2024.01.11

📌 저번에 select 주의 사항에서
집계함수와 일반컬럼을 함께 쓸 수 없다고 했으나
그룹으로 지은 컬럼은 가능하다!

select 
    count(*), buseo
from tblInsa
    group by buseo
        order by count(*) desc;

-- 다중그룹
select 
    count(*), buseo,jikwi
from tblInsa
    group by buseo,jikwi
        order by buseo,jikwi;

select 
    count(*), jikwi,buseo
from tblInsa
    group by jikwi,buseo
        order by jikwi,buseo;

--tblInsa. 과장+부장 몇명? 사원 + 대리 몇명?
select 
    case 
        when jikwi in ('과장', '부장') then 1
        when jikwi in ('대리', '사원') then 2
    end,
    count(*)
from tblInsa
    group by case 
        when jikwi in ('과장', '부장') then 1
        when jikwi in ('대리', '사원') then 2
    end;



having 절

: 그룹에 대한 조건
: having을 만족하는 그룹만 결과셋에 남는다.


  • 실습 코드
-- 전직원 중 급여가 150만원 이상 사람들을 부서별로 그룹지어 인원수를 가져오시오   
select                          --4. 각 그룹별 > 집계함수
    buseo, 
    count(*),
    round(avg(basicpay))
    from tblInsa                --1. 60명의 데이터를 가져온다.
    where basicpay >= 1500000   --2. 60명을 대상으로 조건을 검사한다.
        group by buseo;         --3. 2번을 통과한 사람들을 대상으로 그룹을 짓는다. (7개의 부서가 아닐 수 도 있음)

-- 전직원을 부서별로 그룹 짓고, 그 그룹별 평균 급여가 150만원 이상인 그룹의 인원수
select 
    buseo,                              --4. 각 그룹별 > 집계함수
    count(*),
    round(avg(basicpay))
from tblInsa                            --1. 60명의 데이터를 가져온다.
    group by buseo                      --2. 60명을 대상으로 그룹을 짓는다. (7개의 그룹이 만들어짐)
        having avg(basicpay) >=1500000; --3. 그 그룹을 대상으로 조건을 검사한다.

-- 부서내(group by) 과장/부장(where)의 인원수가 3명 이상(having)인 부서? 
select
    buseo, count(*)
from tblInsa
    where jikwi in ('과장','부장')
        group by buseo
            having count(*) >= 3;
            
            

업로드중..

profile
하루를 정리하고 기록합니다.

0개의 댓글