728x90
반응형
집계 함수

 

  • 여러 행에 대해 하나의 결과를 출력하는 그룹 함수를 이용하여 여러가지 집계 연산을 수행
  • 여러 행들의 그룹이 모여서 그룹당 단 하나의 결과를 돌려주는 함수이다.
  • 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)
    • 여러 행 간의 관계 정의 함수, 중첩 불가

    • 윈도우 함수의 종류
      1. 순위 함수
        - 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;

        부서 | 이름 | 연봉 | 순위
        모든 순위 내림차순으로.
        부서별로 연봉 정렬 부서 순위
        직원 테이블로부터.
      2. 윈도우 일반 집계 (AGGREGATE) 함수
        - SUM(합), MAX(최대값), MIN(최소값), AVG(평균값) 등
      3. 행 순서 함수
        - FIRST_VALUE / LAST_VALUE 함수 : 첫 값 / 끝 값
        - LAG / LEAD : 이전 값 / 이후 값
        - LEAD(E,A)는 E에서 A번째 행의 값을 호출하는 형태로도 쓰임 (A의 기본값은 1)

      4. 비율 함수
        - 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;

 

 

728x90
반응형

'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

+ Recent posts