SQL 문제풀기
October 01, 2018
GROUP BY와 HAVING 절
SELECT 칼럼명, GROUP 함수
FROM 테이블명
WHERE 조건식
GROUP BY 칼럼명 -- 전체 데이터를 소그룹으로 나눌 칼럼 명시
HAVING 조건식 -- 그룹에 대한 조건
ORDER BY 칼럼이나 표현식
;
문제 1
- 각 부서(dept_id)별 평균 급여를 계산해서 보여주시오.
SELECT dept_id, round(avg(salary)) FROM s_emp
GROUP BY dept_id
ORDER BY 1 -- dept_id를 뜻함
;
문제 2
- 각 부서(dept_id)별로 직책이 사원인 직원들의 평균 급여를 계산해서 보여주시오.
SELECT dept_id AS 부서, round(avg(salary)) AS "부서별사원평균급여" FROM s_emp
WHERE title = '사원'
GROUP BY dept_id
ORDER BY 1
;
문제 3 HAVING
- 각 부서별로 평균 급여를 구하되 평균 급여가 2000이상인 부서만 나타내시오
SELECT dept_id AS 부서, round(avg(salary)) AS "평균급여>2000" FROM s_emp
GROUP BY dept_id
HAVING round(avg(salary)) > 2000
;
- having : 그룹에 대한 조건은 where절이 아니라 having절에서 기술한다.
문제 4
- 각 직책(title)별로 급여의 총합을 구하되 직책이 부장이 사람은 제외하시오 단, 급여총합이 8000(만원) 이상인 직책만 나타내며, 급여 총합에 대한 오름차순으로 정렬하시오.
SELECT title, sum(salary) FROM s_emp
WHERE title NOT LIKE '%부장'
GROUP BY title
;
문제 5 SUBGROUP
- 각 부서내에서 각 직책별로 몇 명의 인원이 있는지를 나타내시오.
SELECT dept_id AS 부서, title AS 직책, count(*) AS 인원수 FROM s_emp
GROUP BY dept_id, title
ORDER BY 1, 2 --첫번째 정렬 dept_id, 두번째 정렬 title
;
문제 6
- 각 부서별로 급여의 최소값과 최대값을 나타내시오. 단, 최소값과 최대값이 같은 부서는 출력하지 마시오.
SELECT dept_id AS 부서, min(salary) AS 최소급여, max(salary) AS 최대급여 FROM s_emp
GROUP BY dept_id
HAVING min(salary) <> max(salary)
ORDER BY 1
;
참고자료
(예제로 배우는 ORACLE 11g)[https://wikidocs.net/3901]