sum 연봉 over partition by 부서id order by 사원 id rows between unbounded preceding and current row
이 쿼리는 윈도우 함수(`SUM`)를 사용하여, 각 사원의 연봉 합계를 부서별로 계산하면서, 특정 범위 내의 행들에 대한 합계를 구하는 예시입니다. 구문과 동작을 하나씩 살펴보겠습니다.
### 구문 설명
```sql
SUM(연봉) OVER (
PARTITION BY 부서ID
ORDER BY 사원ID
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
```
#### 각 구성 요소의 역할:
- **`SUM(연봉)`**: 연봉(`연봉` 열)의 합계를 계산하는 집계 함수입니다.
- **`OVER`**: 윈도우 함수(`SUM`, `ROW_NUMBER`, `AVG` 등)와 함께 사용되어, 이 함수가 어떻게 동작할지를 지정합니다.
- **`PARTITION BY 부서ID`**: 부서별로 데이터를 그룹화합니다. 즉, `부서ID`가 동일한 행들끼리 묶입니다. 이 묶음 내에서만 윈도우 함수가 적용됩니다.
- **`ORDER BY 사원ID`**: 각 부서 내에서 `사원ID`에 따라 데이터를 정렬합니다.
- **`ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`**:
- **`ROWS`**: 윈도우 프레임을 행 단위로 정의합니다.
- **`BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`**: 윈도우 프레임이 시작부터(`UNBOUNDED PRECEDING`) 현재 행(`CURRENT ROW`)까지의 범위 내에 있는 모든 행을 포함함을 의미합니다.
### 이 구문의 동작
이 구문은 다음과 같은 방식으로 동작합니다:
1. **부서별로 데이터 그룹화**: `PARTITION BY 부서ID`를 통해 데이터가 부서별로 분할됩니다.
2. **부서 내에서 사원ID로 정렬**: `ORDER BY 사원ID`에 따라 각 부서 내에서 사원들이 정렬됩니다.
3. **윈도우 프레임 내에서 연봉 합계 계산**: 현재 사원까지 포함하여 그 앞의 모든 행들의 연봉을 합산합니다.
### 예시 데이터
아래와 같은 데이터를 가진 `employees` 테이블이 있다고 가정해 봅시다:
| 사원ID | 부서ID | 연봉 |
|--------|--------|-------|
| 1 | 10 | 5000 |
| 2 | 10 | 6000 |
| 3 | 10 | 4000 |
| 4 | 20 | 7000 |
| 5 | 20 | 6000 |
### 결과 예시
위의 구문을 실행하면 각 사원에 대한 연봉 합계가 계산됩니다. 이 때의 결과는 다음과 같습니다:
| 사원ID | 부서ID | 연봉 | 연봉 합계 (누적) |
|--------|--------|-------|------------------|
| 1 | 10 | 5000 | 5000 |
| 2 | 10 | 6000 | 11000 |
| 3 | 10 | 4000 | 15000 |
| 4 | 20 | 7000 | 7000 |
| 5 | 20 | 6000 | 13000 |
- **사원ID 1**: 연봉은 5000이며, 그 전의 데이터가 없으므로 연봉 합계는 5000입니다.
- **사원ID 2**: 연봉은 6000이며, 사원ID 1의 연봉 5000과 합쳐져서 11000이 됩니다.
- **사원ID 3**: 연봉은 4000이며, 앞선 사원들의 연봉 합계(5000 + 6000)와 합쳐져서 15000이 됩니다.
- **사원ID 4**: 새로운 부서(부서ID 20)로 넘어가서, 이 부서 내에서 처음 사원이므로 연봉 합계는 7000입니다.
- **사원ID 5**: 부서ID 20에서 두 번째 사원이므로, 앞선 사원의 연봉과 합쳐져서 13000이 됩니다.
### 요약
- **`SUM(연봉)`**는 지정된 윈도우 프레임 내에서 연봉의 합계를 계산합니다.
- **`PARTITION BY 부서ID`**는 부서별로 데이터를 나누어 각 부서 내에서만 연봉 합계를 계산합니다.
- **`ORDER BY 사원ID`**는 각 부서 내에서 사원ID를 기준으로 순서를 정합니다.
- **`ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW`**는 현재 행까지의 모든 이전 행들의 연봉을 합산합니다.
이 쿼리는 특정 그룹(부서) 내에서 누적 합계를 구하는 데 유용합니다.
'Data Analysis 데이터 분석 > SQL 통한 Database 관리' 카테고리의 다른 글
desc 내림차순의 의미 (0) | 2024.08.19 |
---|---|
row number () over(partition by order by) as COL1 (0) | 2024.08.19 |
max(연봉) over (order by 연봉 desc rows current row) as col3 (0) | 2024.08.19 |
order by 연봉 desc 할때, 연봉값은 같고 사원id 가 다른 두개 있을때 누가 먼저 (0) | 2024.08.19 |
roll up 함수 (0) | 2024.08.19 |