집계 함수
- 여러 행에 대해 하나의 결과를 출력하는 그룹 함수를 이용하여 여러가지 집계 연산을 수행
- 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 함수이다.
- GROUP BY 절은 행들을 소그룹화 한다.
- SELECT, HAVING, ORDER BY 절에 사용할 수 있다.
- 다중 행 함수(Multi-Row Function)
- 여러 행의 그룹에 대해 적용되는 함수
- 다중 행 함수의 종류:
* 그룹 함수(Group Function):
> 집계 함수(Aggregate Function): COUNT, SUM, AVG, MAX/MIN 등
> 고급 집계함수: ROLLUP, CUBE, GROUPING SETS
* 윈도우 함수(Window Function)
> 집계 함수
- 여러 행의 그룹에 대한 연산을 통해 하나의 결과를 반환함 (다중행. 단일컬럼?)
- SELECT, HAVING, ORDER BY 절에 사용 가능
- GROUP BY 절을 통해 그룹핑 기준 명시.
- 집계 함수 종류
함수 | 설명 | 예 |
COUNT() | 행의 개수 | COUNT(salary) |
SUM() | 합계 | SUM(salary) |
AVG() | 평균 | AVG(salary) |
MIN() | 최소값 | MIN(salary) |
MAX() | 최대값 | MAX(salary) |
STDDEV() | 표준편차 | STDDEV(salary) |
VARIANCE() | 분산 | VARIANCE(salary) |
- COUNT() : 열(Column)의 행 개수를 구하는 함수
SELECT COUNT(salary)
FROM employees;
SELECT COUNT(manager_id)
FROM employees;
SELECT COUNT(commission_pct)
FROM employees;
SELECT COUNT(*)
FROM employees;
- SUM() / AVG() : 열의 합계, 평균을 구하는 함수
SELECT SUM(salary), AVG(salary)
FROM employees;
SELECT SUM(salary), COUNT(salary)
FROM employees;
SELECT
first_name, salary,
SUM(salary) OVER (ORDER BY first_name)
FROM employees;
- MIN() / MAX() : 열의 최소값 및 최대값을 구하는 함수
SELECT MIN(salary), MAX(salary)
FROM employees;
SELECT MIN(first_name), MAX(first_name)
FROM employees;
- STDDEV() / VARIANCE() : 표준편차 및 분산을 구하는 함수
SELECT STDDEV(salary), VARIANCE(salary)
FROM employees;
SELECT first_name, salary,
STDDEV(salary) OVER (ORDER BY first_name)
FROM employees
WHERE department_id = 50;
GROUP BY
WHERE 절을 통해 조건에 맞는 데이터를 조회했지만 테이블에 1차적으로 존재하는 데이터 이외의 정보,
예를 들면 각 팀별로 선수가 몇명인지, 선수들의 평균 신장과 몸무게가 얼마나 되는지, 또는 각 팀에서 가장 큰 기의 선수가
누구인지 등의 2차 가공 정보도 필요하다. GROUP BY 절은 SQL 문에서 FROM 절과 WHERE 절 뒤에 오며,
데이터들을 작은 그룹으로 분류하여 소그룹에 대한 항목별로 통계정보를 얻을 때 추가로 사용된다.
- 지정한 열의 데이터 값을 기준으로 그룹화하여 집계 함수 적용
- GROUP BY 동작 순서
- 테이블에서 WHERE 조건식에 맞는 데이터 값만 구분
- 지정한 열 기준으로 같은 데이터 값으로 그룹화
- 지정한 열들의 그룹화된 집계 결과 출력
- GROUP BY 절 특징
- WHERE 절은 그룹화 되기 전에 조건식 적용
- GROUP BY 절 사용시 SELECT 절에 지정된 기준 열을 지정
- SELECT 절에 그룹 함수 없이도 GROUP BY 절 사용 가능
SELECT job_id, SUM(salary), AVG(salary)
FROM employees
GROUP BY job_id;
SELECT job_id, SUM(salary), AVG(salary)
FROM employees
WHERE department_id = 50
GROUP BY job_id;
SELECT department_id, MIN(salary), MAX(salary)
FROM employees
GROUP BY department_id;
SELECT department_id, MIN(salary), MAX(salary)
FROM employees
WHERE hire_date > '20070101'
GROUP BY department_id;
SELECT country_id, COUNT(country_id)
FROM locations
GROUP BY country_id
ORDER BY country_id;
- 다중 GROUP BY 절
SELECT
job_id, department_id,
SUM(salary), AVG(salary)
FROM employees
WHERE department_id BETWEEN 50 AND 100
GROUP BY job_id, department_id
ORDER BY job_id;
HAVING
- WHERE 절에서는 그룹 함수를 사용할 수 없음
- 그룹화된 집계 결과에 조건식을 적용할 때 HAVING 절을 사용
SELECT job_id, SUM(salary), AVG(salary)
FROM employees
GROUP BY job_id
HAVING AVG(SALARY) > 10000;
SELECT DEPARTMENT_ID, MIN(SALARY), MAX(SALARY)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING MAX(SALARY) > 7000;
SELECT country_id, COUNT(country_id)
FROM locations
GROUP BY country_id
HAVING COUNT(country_id) > 2
ORDeR BY country_id;
SELECT
job_id, department_id,
SUM(salary), AVG(salary)
FROM employees
WHERE department_id BETWEEN 50 AND 100
GROUP BY job_id, department_id
Having AVG(salary) > 9000
ORDER BY job_id;
SELECT
manager_id, department_id, job_id,
SUM(salary), MIN(salary), MAX(salary)
FROM employees
WHERE manager_id IN (100, 101)
GROUP BY manager_id, department_id, job_id
HAVING SUM(salary) BETWEEN 10000 AND 40000
ORDER BY manager_id, department_id;
Summary (Group Function- 그룹함수)
- ROLLUP 함수
- ROLLUP에 지정된 Grouping Columns의 List는 Subtotal을 생성하기 위해 사용
- Grouping Columns의 수를 N이라고 햇을 때 N + 1 Level의 Subtotal이 생성
ex) Department Name 을 소그룹화 할 경우,
Accounting, Sales, Management, Human Resource 의 4개 부서가 있다면,
4 개 부서 + 이 부서를 소계(Subtotal)한 행(Row) + 1 = 총 5건의 Row 생성 - GROUP BY로 묶인 칼럼의 소계 계산, 계층 구조
- GROUP BY 칼럼 순서가 바뀌면 결과 값이 바뀜
- GROUP BY의 확장된 형태
- GROUP BY ROLLUP(A) : 전체 합계, 칼럼 A 소계
- GROUP BY ROLLUP(A, B) : 전체 합계, 칼럼 A 소계, 칼럼 (A, B) 조합 소계
- GROUP BY ROLLUP(A, B, C) : 전체 합계, 칼럼 A 소계, 칼럼 (A, B) 조합 소계, (A, B, C) 조합 소계
- GROUP BY ROLLUP(A, (B, C)) : 전체 합계, 칼럼 A 소계, ZKFFJA (A, (B, C)) 조합 소계
- GROUP BY A, ROLLUP(B) : A 그룹별 집계, A 그룹 내부에서 B 칼럼별 집계
-- 부서명과 업무명을 기준으로 사원수와 급여 합을 집계한
-- 일반적인 GROUP BY SQL 문장을 수행
SELECT DNAME, JOB, COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY DNAME, JOB;
- CUBE 함수
- 결합 가능한 모든 값에 대한 다차원 집계
- GROUP BY CUBE(A) : 전체 합계, 칼럼 A 소계
- GROUP BY CUBE(B) : 전체 합계, 칼럼 A 소계, 칼럼 B 소계, 칼럼 (A, B) 조합 소계
- 결합 가능한 모든 값에 대한 다차원 집계
-- 부서명과 업무명을 기준으로 사원수와 급여 합을 집계한
-- 일반적인 GROUP BY SQL 문장을 수행
SELECT CASE GROUPING(DNAME) WHEN 1 THEN 'All Departments'
ELSE DNAME END AS DNAME,
CASE GROUPING(JOB) WHEN 1 THEN 'All Jobs'
ELSE JOB END AS JOB,
COUNT(*) "Total Empl",SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY CUBE(DNAME, JOB);
/*
CASE문 첫번째 부서명이 1이면 All Departments 아니라면 부서명
CASE문 두번째 업무명이 1이면 All Jobs 아니라면 업무명
그리고 총 사원수와 급여 합을 SELECT 조회
FROM 직원, 부서 테이블에서 (EMP, DEPT)
WHERE 조건은 부서.부서번호 = 직원.부서번호 // 부서명 소계, 업무명 소계
GROUP BY CUBE(DNAME, JOB); // (부서명, 업무명) 소계
전체 합계
*/
- GROUPING SETS 함수
- 특정 항목에 대한 소계 계산, GROUP BY 칼럼 순서와 무관하게 개별적으로 처리
- 내가 보고 싶은 것만 소계를 생성
- Group By GROUPING SETS(A) : 컬럼 A 소계
- Group By GROUPING SETS(A, B) : 컬럼 A 소계, 컬럼 B 소계
- Group By GROUPING SETS((A, B)) : 컬럼 (A, B) 소계
- 윈도우 함수 (Windows Function)
- 여러 행 간의 관계 정의 함수, 중첩 불가
- 윈도우 함수의 종류
- 순위 함수
- RANK: 중복 순위 포함
- DENSE_RANK: 중복 순위 무시 (중간 순위를 비우지 않음)
- ROW_NUMBER : 단순히 행 번호 표시, 값에 무관하게 고유한 순위 부여
" 사원 데이터에서 급여가 높은 순서와 JOB별로 급여가 높은 순서를 같이 출력한다"
SQL>>
SELECT JOB, ENAME, SAL, RANK( )
OVER (ORDER BY DESC) ALL_RANK, RANK( )
OVER (PARTITION BY JOB
ORDER BY SAL DESC) JOB_RANK
FROM EMP;
부서 | 이름 | 연봉 | 순위
모든 순위 내림차순으로.
부서별로 연봉 정렬 부서 순위
직원 테이블로부터. - 윈도우 일반 집계 (AGGREGATE) 함수
- SUM(합), MAX(최대값), MIN(최소값), AVG(평균값) 등 - 행 순서 함수
- FIRST_VALUE / LAST_VALUE 함수 : 첫 값 / 끝 값
- LAG / LEAD : 이전 값 / 이후 값
- LEAD(E,A)는 E에서 A번째 행의 값을 호출하는 형태로도 쓰임 (A의 기본값은 1) - 비율 함수
- RATIO_TO_REPORT : 전체 SUM(칼럼)값에 대한 행별 칼럼 값의 백분율을 소수점 반환
- PERCENT_RANK: 제일 먼저 나오는 것 0, 제일 늦게 나오는 것 1, 행의 순서별 백분율
- CUME_DIST : 전체 건수에서 현재 행보다 작거나 같은 건수에 대한 누적 백분율
- 순위 함수
- 여러 행 간의 관계 정의 함수, 중첩 불가
SELECT FROM WHERE ORDER BY / GROUP BY
SELECT POSITION, ROUND(AVG(HEIGHT), 2) 평균키
FROM PLAYER
GROUP BY POSITION
HAVING AVG(HEIGHT) >= 180;
포지션별 키의 평균을 출력하되, 해당 포지션의 키의 최대 값이 190CM 이상인 경우만 출력 QUERY.
SELECT POSITION, ROUND(AVG(HEIGHT), 2) 평균키
FROM PLAYER
GROUP BY POSITION
HAVING MAX(HEIGHT) >= 190;
--
그룹핑 기준을 2개인 경우, (복수 개의 평균)..
(1학년 남학생, 2학년 남학생)
(초등학생 키, 1학년 남자, 1학년 여자, 2학년 남자, 2학년 여자.. 복수 개의 컬럼에 대한 집계)
SELECT DNAME, JOB, COUNT(*) 직원수, SUM(SAL) AS 급여합 (그룹핑한 DNAME과JOB 그리고 집계함수)
FROM EMP, DEPT (두개의 테이블 JOIN 하는 구조)
WHERE DEPT.DEPTNO = EMP.DEPTNO (각 DEPT, EMP 테이블의 DEPTNO 컬럼을 연결)
GROUP BY DNAME, JOB (부서이름과 직무를 그루핑(복수 개의 컬럼 그룹핑))
ORDER BY DNAME, JOB;
1. SALES MANAGER 1 2850
2. SALES CLELRK 1 950
...
--
SELECT 문장의 구조.
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
실제 실행 순서
FROM - 테이블 참조
WHERE - 필터링
GROUP BY - 행 그룹화
HAVING - 그룹화 필터링
SELECT - 데이터 값 계산 및 출력 조회
ORDER BY - 데이터 정렬.
--
- 칼럼의 유효 범위
SELECT PLAYER_NAME, HEIGHT (3. PLAYER_NAME, HEIGHT 를 보여주되)
FROM PLAYER (1. PLAYER 테이블에서)
WHERE (2. POSITION 이 MF미드필더인 것을 추출)
ORDER BY TEAM_ID (4. TEAM_ID 오름차순으로)
SELECT 절에서도 명시되지 않아도 WHERE, ORDER BY에서도 사용 가능
- GROUP BY 가 사용되는 경우
SELECT 절에서 명시되지 않은 집계칼럼을 HAVING, ORDER BY에도 사용 가능.
- 인라인 뷰(Inline View)가 사용되는 경우
: 새로운 테이블 구조가 생성된 것으로 이해해야 됨.
: 인라인 뷰의 SELECT절에 명시되지 않은 칼럼은 메인 쿼리에서 사용 불가
--
고급집계 함수
ROLLUP
- 소그룹별 소계 계산 추가(순서가 중요!)
group by와 관련이 많음.
GROUP BY ROLLUP(X, Y)
X 기준 소집계, Y컬럼은 해당되지 않음.
- 소그룹 별 소계 계산 추가
: 각 DNAME/JOB/MGR 별 집계
: 각 DNAME/JOB 별 집계
: 각 DNAME 별 집계
: 전체 집계
SELECT DNAME, JOB, MGR, COUNT(*) 직원수, SUM(SAL) AS 급여합 (4. 해당 칼럼 순서로 조회하되)
FROM EMP, DEPT (1. EMPLOYEE 와 DEPARTMENT RELATION에서)
WHERE DEPT.DEPTNO = EMP.DEPTNO (2. EACH TABLE 에서 DEPTNO를 매개 삼아 JOIN)
GROUP BY ROLLUP (DNAME, JOB, MGR) (3. 소괄호 순서대로 EACH SUM TOTAL)
ORDER BY DNAME, JOB, MGR; (5. 정렬은 해당 순서로)
DNAME JOB MGR 직원수 급여합
ACCOUNTING CLERK 7782 1 1300
ACCOUNTING CLERK (null) 1 1300
ACCOUNTING CLERK 7839 1 2450
ACCOUTNING MANAGER 7266 1 2300
ACCOUNTING PRESIDENT (null) 1 5000
ACCOUNTING (null) (null) ---
SUB TOTAL -> GRAND TOTAL 순으로.. (ROLLUP)
---
GROUPING 함수는
ROLLUP 으로 각 단계별 TOTAL을 하게 되면 소집계 여부에 대해 0 OR 1 을 통해 보여주는 칼럼.
SELECT DNAME, GROUPING(DNAME), JOB, GROUPING(JOB), COUNT(*) "Total Empl", SUM(SAL) "Total Sal"
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY ROLLUP (DNAME, JOB);
어디까지 집계되었는지 알려주는 것
EX)
SALES 0
SALES 0
SALES 0
SALES 1 <- SALES라는 DNAME(부서이름) 별로 GROUPING 하여 소집계(SUB TOTAL) 알려주는 것
--
GROUPING + CASE 문의 활용 (더욱 직관적으로 볼 수 있다.)
SELECT
CASE GROUPING(DNAME) (CASE문에 해당되면 DNAME 필드에 (null) 대신 )
WHEN 1 THEN 'All Departments' (1이라면 ALL DEPARTMENTS 이 입력)
ELSE DNAME (아니라면 DNAME 이 넣어짐)
END AS DNAME
case GROUPING(JOB)
WHEN 1 THEN 'All Jobs'
ELSE JOB
END AS JOB
...
해당 방법으로 GROUPING + CASE 문을 사용하여 직관적으로 볼 수 있게 함.
SALES 0 (0 숫자 보이지 않음)
SALES 0 (0 숫자 보이지 않음)
SALES 1 <- 1대신 All JOBS 는 소집계로 예를들어 5개.
RESEARCH
RESEARCH
ACCOUNTING
...
All Departments All Jobs 20개 (이렇게 마무리)
--
- CUBE
(ROLLUP과 유사한데 순서가 무관하다.)
- 다차원 소계 계산 추가 (순서 무관 / ROLLUP은 순서 중요)
- 모든 조합의 집계 계산 -> 시스템 부하가 크다.
SELECT DNAME, JOB, COUNT(*) 직원수, SUM(SAL) 급여합
FROM EMP, DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY CUBE (DNAME, JOB)
ORDER BY DNAME, JON;
= (같다) // 달라진 것은 CUBE 함수 내 칼럼 순서 (순서무관증명)
※ 만약 ROLLUP을 사용하여 CUBE와 같은 결과를 내려면
위아래 QUERY 문 중앙인 이곳에
UNION
을 써주고 위아래 쿼리문의 GROUP BY 'CUBE' 를 'ROLLUP'으로
바꾼다면 같은 결과를 출력할 수 있음.(ROLLUP을 사용한 CUBE의 구현)
SELECT DNAME, JOB, COUNT(*) 직원수, SUM(SAL) 급여합
FROM EMP, DEPT
WHERE DEPT.DEPTNO = ENP.DEPTNO
GROUP BY CUBE (JOB, DNAME)
ORDER BY DNAME, JOIN
--
GROUPING SETS
- 여러 칼럼 각각에 대해 반복적으로 그룹화
SELECT DNAME, JOB, COUNT(*) 직원수, SUM(SAL) 급여합
FROM EMP,DEPT
WHERE DEPT.DEPTNO = EMP.DEPTNO
GROUP BY GROUPING SETS (DNAME, JOB);
DNAME으로 그룹화 , JOB으로 그룹화
그전에는 DNAME 기준. 그룹화..
하지만 이것은 각각 그룹화.
결국 소그룹 집계된 것만 출력한다는 것임
1+ 1+ 1 = 3 이 아닌 그냥 3만 출력
--
GROPING SETS
-GROUPING + DECODE 문
이 조합은 CASE 문을 축약한 형태라고 보면됨
--
- GROUPING SETS
GROUP BY와 UNION ALL을 사용한 GROUPING SETS의 구현 (아이디어로 응용한것)
SELECT 'All Departments' AS DNAME --
FROM
WHERE --
GROUP BY JOB
UNION ALL
SELECT DNAME 'All Jobs' AS JOB --
FROM
WHERE
GROUP BY DNAME
그냥 해당 쿼리 참고.
---
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
GROUP BY
ROLLUP(순서), CUBE(순서X,전체 세부적으로), GROUPING SETS(깔끔하게 소계만)
DECODE, CASE <- 분기를 위해 쓰는 OPTION
UNION, UNION ALL <- 각 두 쿼리의 조합으로 ROLLUP 혹은 CUBE 등 응용하여 만듬
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
---
---
윈도우 함수(Window Function)
□ 윈도우 함수
- 기존 관계형 DB는 칼럼간 연산은 쉽지만 행간의 연산은 어렵다.
- 행 간의 관계 정의를 위해 윈도우 함수를 고안.
예) 각 직원이 속한 부서 내에서 급여 순위는?
- 중첩(Nested) 사용 불가
- 서브쿼리에서도 사용 가능
- 종류:
순위, 집계, 행순서, 비율, 통계
순서: RANK, DENSE_RANK_ROW_NUMBER
집계: SUM, MAX, MIN, AVG, COUNT
...
- 집계함수와 윈도우함수와의 차이
집계함수 : 전체 칼럼(수직)의 통계(평균, COUNT 등)
윈도우함수 : 전체에서 칼럼(수직)내에서 나의 위치 기준()
아파트를 예를 들어본다면.
25층짜리 아파트가 있다.
그리고 아파트 내 세대도 1호수 2호수 3호수 4호수로 나눠질 것이다.
그렇다면 이를 이런 테이블로도 보일 수 있다.
층수 1호 2호 3호 4호
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 X 0 0
5 0 0 0 0
6 0 0 0 0
...
25 0 0 0 0
아파트로 표현하면 다음과 같은데
집계함수는 1호 칼럼 전체에 대한 집계로 볼 수 있으며
윈도우함수는 2호 칼럼 내에서 4층의 X 기준(시각)으로 보는 것이 됨.
밖에서 바라봤을 때는 창문 하나만 열려있는 것이라고 보면됨.
--
WINDOW 함수의 기본 구조
SELECT WINDOW_FUNCTION (ARGUMENTS) OVER
( [PARTITION BY 칼럼] [ORDER BY 절] [WINDOWING 절] )
FROM 테이블 명;
WINDOW_FUNCTION: 기존함수 Or WINDOW 함수로 추가된 함수
ARGUMENTS(인수): 함수에 따라 0-N개의 인수 지정
PARTITION BY 절: 전체 집합을 기준에 의해 소그룹으로 나눌 수 있음
ORDER BY 절: 정렬 기준 항목
WINDOWING 절: 함수의 대상이 되는 행 기준의 범위를 지정
-ROWS / RANGE 중 하나를 선택하여 사용
ROWS: 행의 수를 기준으로 한 범위
RAGNGE: 값을 기준으로 한 범위
ROWS BETWEEN 1 PRECEDING AND FOLLOWING
: 해당 파티션 내에서 앞의 한행, 현재행, 뒤의 한행을 범위로 지정
RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING
:해당 파티션 내에서 (현재 행의 값 - 50) ~ (현재 행의 값 + 150)을 범위로 지정
RANGE UNBOUNDED PRECEDING
: 현재 파티션의 첫 행부터 현재 행까지 지정 (첫행부터)
--
가장 많이쓰임.. 순위
- RANK 함수
동일한 값에는 동일한 순위 부여
동일한 순위를 여러 건으로 취급.
예) 1등이 2명인 경우 -> 1등, 1등, 3등
예) 전체급여 순위, JOB 내에서 급여 순위 출력
SELECT JOB, ENAME, SAL,
RANK() OVER (ORDER BY SAL DESC) AS ALL_RANK,
RANK() OVER (PARTITION BY JOB ORDER BY SAL DESC) AS JOB_RANK
FROM EMP;
ORDER BY SAL DESC
샐러리 높은순에서 낮은순으로 정렬하면
1000
900
400
300
..
이렇게 나누면 1000이 1등 다음이 2등 이 중에서 나의 RANK를 출력하라.
RANK OVER()
: 동일 값에 동일 순위부여
: 동일 순위를 여러 건으로 취급 (1등, 1등, 3등, ...)
DENSE_RANK OVER()
: 동일 값에 동일 순위 부여
: 동일 순위를 한건으로 취급(1등, 1등, 2등, ...)
ROW_NUMBER OVER()
: 동일 값에 다른 순위 부여 (1등, 2등, 3등, ...)
SELECT JOB, ENAME, SAL
RANK() OVER (ORDER BY SAL DESC) RANK,
DENSE_RANK() OVER (ORDER BY SAL DESC) DENSE_RANK,
ROW_NUMBER() OVER (ORDER BY SAL DESC) ROW_NUMBER
FROM EMP;
--
MAX/MIN 집계 윈도우 함수
COUNT SUM AVG 집계 윈도우 함수..
--
MAX/MIN
예) 각 직원이 속한 직업 내에서 급여의 최대값을 함께 출력하기 위한 질의
SELECT JOB, ENAME, SAL,
MAX(SAL) OVER (PARTION BY JOB) JOB_MAX
FROM EMP
ORDER BY JOB, ENAME;
정말 궁금한건 회사 내에서 제일 많이 받는 사람은 얼마나 받을까가 아니라
내가 일하는 부서에서 제일 받는 사람은 누구인가.(내 연봉의 고점)
--
SUM/AVG
예) 각 직업 내에서, 본인보다 높은 급여를 받는 직원의 급여 총합(본인 포함)
SELECT JOB, ENAME, SAL,
SUM(SAL) OVER (PARTITION BY JOB ORDER BY SAL DESC RANGE UNBOUNDED PRECEDING)
AS JOB_SUM
FROM EMP;
해당 파티션의 첫행부터 나까지..
(연봉 높은 사람부터 나까지).
--
COUNT
예) 본인보다 급여가 100 적은 직원부터 200 많은 직원까지의 총 직원 수
SELECT ENAME, SAL, COUNT(*) OVER (ORDER BY SAL
RANGE BETWEEN 100 PRECEDING AND 200 FOLLOWING) AS MOV_COUNT
FROM EMP;
'Language > RDBMS' 카테고리의 다른 글
[DML_SELECT] 서브 쿼리 (0) | 2023.03.03 |
---|---|
[DML_SELECT] JOIN 연산 (0) | 2023.03.03 |
[DML_SELECT] SQL 함수(숫자, 날짜, 변환, 일반) (0) | 2023.03.03 |
[DML_SELECT] SQL 함수(문자) (0) | 2023.03.03 |
[DML_SELECT] SQL 연산자 (0) | 2023.03.02 |