공부/Database 복습

4.Database 그룹 함수

ChoiDooSic 2021. 7. 19. 02:52

/*
# 그룹 함수

- 여러 행의 값을 특정 컬럼을 기준으로 그룹화 하여 결과를 얻는 함수 
- 특정 집단의 총합, 개수, 평균 등을 구할 수 있다 
*/
-- sum(column) : 각 그룹의 총합을 구하는 그룹 함수
SELECT sum(salary) || '$' FROM employees;
SELECT to_char(sum(salary), '999,999L')  FROM employees;

-- 부서별 총 월급 구해보기
SELECT  department_id, sum(salary) FROM employees GROUP BY department_id;
SELECT d.department_name, sum(salary) 

FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY department_name;

SELECT d.department_name, sum(salary)  FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY department_name; (부서의 이름을 보여주고 싶어서 조인을 사용하였는데 자세한 설명은 조인 업로드를 할때에 설명하도록 하겠다)

 

-- avg(column) : 각 그룹의 평균값을 구하는 그룹 함수
-- 직책별 총 월급 구해보기
SELECT  job_id, sum(salary) FROM employees GROUP BY job_id;

SELECT  job_id, sum(salary) FROM employees GROUP BY job_id;


-- # GROUP BY로 그룹을 나누고 나면, 그룹을 나누는 기준이 되는 컬럼과 그룹 함수의 결과만 조회할 수 있다
-- max(column) : 각 그룹에서 가장 큰 값을 지닌 결과를 구하는 그룹 함수
-- min(column) : 각 그룹에서 가장 작은 값을 지닌 결과를 구하는 그룹 함수
--  count(column) : 각 그룹의 행의 개수를 구하는 그룹 함수

--(각 직책별 사원이 몇명있는가 ? / count는 대부분 별이랑 같이 씀 )
SELECT job_id, count(*) FROM employees GROUP BY job_id;
SELECT job_id, count(commission_pct) FROM employees GROUP BY job_id;

SELECT job_id, count(*) FROM employees GROUP BY job_id;


-- 연습1 : 직책별로 가장 최근에 새로운 사원이 입사한 날짜와 오래전에 입사한 날짜를 출력해보세요
SELECT job_id,max(hire_date), min(hire_date) FROM employees GROUP BY job_id;
 

-- 연습2: 직책별로 가장 최근에 입사한 사원의 이름/고용일/직책/월급을 출력해보세요
 SELECT first_name,job_id,hire_date,salary 

FROM employees WHERE (job_id,hire_date) IN (SELECT job_id,max(hire_date) FROM employees GROUP BY job_id);
 
-- GROUP BY에 여러 컬럼 설정해보기
SELECT job_id, department_id,MAX(salary) FROM employees GROUP BY job_id,department_id;
   

SELECT job_id, department_id,MAX(salary) FROM employees GROUP BY job_id,department_id;    


--GROUP BY로 그룹을 나눈 후 해당 그룹에 조건을 적용하고 싶을 때는 HAVING절을 사용한다

-- 전체 회사에 5명 이상만 존재하는 직책만 출력
SELECT job_id, count(*) FROM employees GROUP BY job_id HAVING count(*) >= 5;

SELECT job_id, count(*) FROM employees GROUP BY job_id HAVING count(*) >= 5;


-- 3명 이하인 직책만 출력
SELECT job_id,count(*) FROM employees GROUP BY job_id HAVING count(*) <= 3;

-- 월급이 5천달러 이상인 사원들이 각 부서에 몇명씩 있는지 출력
SELECT department_id, count(*) FROM EMPLOYEES WHERE salary >= 8000 GROUP BY department_id; -- 8000이하의 부서 등장도못함

-- GROUP BY와 WHERE를 같이 쓰면 WHRER가 먼저 적용된후 결과를 GROUP BY로 묶는다

-- 연습1: 부서별 최대 급여와 최소 급여를 출려하되 최대 급여가 8000이상인 부서만 출력해보세요
SELECT department_id, MAX(salary) , MIN(salary) FROM employees GROUP BY department_id HAVING MAX(salary) >= 8000;

SELECT department_id, MAX(salary) , MIN(salary) FROM employees GROUP BY department_id HAVING MAX(salary) >= 8000;


-- 연습2: 부서별 평균 급여를 출력하되 해당 부서에 소속된 사람이
--      10명 이상인 부서만 출력해보세요 (평균급여는 소수점 아래 두자리 까지 출력) avg
SELECT department_id, trunc(avg(salary),2), count(*) FROM employees GROUP BY department_id HAVING count(*) >= 10;
-- to_char(avg(salary), '99,999.99') 이것도 평균 월급을 띄울때 소수점을 2자리로 자를수있다

SELECT department_id, trunc(avg(salary),2), count(*) FROM employees GROUP BY department_id HAVING count(*) >= 10;







'공부 > Database 복습' 카테고리의 다른 글

6.Database 조인  (0) 2021.08.01
5.Database 정렬  (0) 2021.07.26
3.Database 함수  (0) 2021.07.19
2.Database WHERE  (0) 2021.07.18
1.데이터베이스 SELECT  (0) 2021.07.17