다음 SQL 의 실행 결과로 옳은 것은?[청구]청구번호고객번호금액1K1… | [SQLD] SQL 개발자 기출유형 모의고사 10회 상세 페이지
1[SQLD] SQL 개발자 기출유형 모의고사 10회
다음 SQL 의 실행 결과로 옳은 것은?[청구]
| 청구번호 | 고객번호 | 금액 |
|---|---|---|
| 1 | K1 | 100 |
| 2 | K1 | 50 |
| 3 | K2 | 200 |
| 4 | K3 | (null) |
| 5 | K3 | 30 |
| 6 | K2 | 20 |
SELECT 고객번호, SUM(금액) AS 합계,
COUNT(*) OVER () AS 고객수,
SUM(SUM(금액)) OVER () AS 전체
FROM 청구
GROUP BY 고객번호
ORDER BY 고객번호;1
| 고객번호 | 합계 | 고객수 | 전체 |
|---|---|---|---|
| K1 | 150 | 6 | 400 |
| K2 | 220 | 6 | 400 |
| K3 | 30 | 6 | 400 |
2
| 고객번호 | 합계 | 고객수 | 전체 |
|---|---|---|---|
| K1 | 150 | 3 | 400 |
| K2 | 220 | 3 | 400 |
| K3 | 30 | 3 | 400 |
3
| 고객번호 | 합계 | 고객수 | 전체 |
|---|---|---|---|
| K1 | 150 | 3 | 150 |
| K2 | 220 | 3 | 370 |
| K3 | 30 | 3 | 400 |
4
| 고객번호 | 합계 | 고객수 | 전체 |
|---|---|---|---|
| K1 | 150 | 3 | (null) |
| K2 | 220 | 3 | (null) |
| K3 | (null) | 3 | (null) |
해설
윈도우 함수는 GROUP BY 가 끝난 뒤 그룹 결과 3행 위에서 계산되므로, 행 수는 고객 수인 3행이고 COUNT(*) OVER () 도 3이다.
SUM(SUM(금액)) OVER () 는 고객별 합계 150·220·30을 모두 더한 400을 각 행에 붙이며, K3 합계는 NULL 을 뺀 30이다.
- 고객수를 6으로 쓴 표는 윈도우 함수가 원본 행에 적용된다고 본 오해이다.
- K3 와 전체를 NULL 로 쓴 표는 집계 함수가 NULL 을 무시한다는 점을 놓쳤다.
- 전체를 누적 값으로 쓴 표는 ORDER BY 가 없는 OVER () 를 누적 프레임으로 본 것이다.
오류나 개정된 내용이 보이면 알려주세요