다음 SQL 의 실행 결과로 옳은 것은?[납입]계약번호회차납입액A011… | [SQLD] SQL 개발자 기출유형 모의고사 10회 상세 페이지
1[SQLD] SQL 개발자 기출유형 모의고사 10회
다음 SQL 의 실행 결과로 옳은 것은?[납입]
| 계약번호 | 회차 | 납입액 |
|---|---|---|
| A01 | 1 | 100 |
| A01 | 2 | (null) |
| A01 | 3 | 100 |
| B02 | 1 | 50 |
| B02 | 2 | 70 |
SELECT 계약번호, 회차, 납입액,
SUM(납입액) OVER (PARTITION BY 계약번호
ORDER BY 회차 DESC) AS 잔여합
FROM 납입
ORDER BY 계약번호, 회차;1
| 계약번호 | 회차 | 납입액 | 잔여합 |
|---|---|---|---|
| A01 | 1 | 100 | 100 |
| A01 | 2 | (null) | 100 |
| A01 | 3 | 100 | 200 |
| B02 | 1 | 50 | 50 |
| B02 | 2 | 70 | 120 |
2
| 계약번호 | 회차 | 납입액 | 잔여합 |
|---|---|---|---|
| A01 | 1 | 100 | 200 |
| A01 | 2 | (null) | 200 |
| A01 | 3 | 100 | 200 |
| B02 | 1 | 50 | 120 |
| B02 | 2 | 70 | 120 |
3
| 계약번호 | 회차 | 납입액 | 잔여합 |
|---|---|---|---|
| A01 | 1 | 100 | (null) |
| A01 | 2 | (null) | (null) |
| A01 | 3 | 100 | 100 |
| B02 | 1 | 50 | 120 |
| B02 | 2 | 70 | 70 |
4
| 계약번호 | 회차 | 납입액 | 잔여합 |
|---|---|---|---|
| A01 | 1 | 100 | 200 |
| A01 | 2 | (null) | 100 |
| A01 | 3 | 100 | 100 |
| B02 | 1 | 50 | 120 |
| B02 | 2 | 70 | 70 |
해설
OVER 안의 ORDER BY 회차 DESC 때문에 누적은 계약별 마지막 회차부터 거꾸로 쌓이고, 출력 순서는 바깥 ORDER BY 에 따라 회차 오름차순이 된다.
A01은 3회차 100, 2회차는 NULL 을 건너뛴 누적이라 100, 1회차 200이며 B02는 2회차 70, 1회차 120이다.
- 1회차부터 쌓은 표는 OVER 의 정렬 방향을 바깥 정렬과 같다고 본 것이다.
- NULL 이후를 NULL 로 쓴 표는 SUM 이 NULL 을 건너뛴다는 점을 놓쳤다.
- 계약별 총합을 모든 행에 쓴 표는 OVER 안의 ORDER BY 를 무시한 결과이다.
오류나 개정된 내용이 보이면 알려주세요