계약별 청구 합계를 구해 다음 [결과]를 얻으려 한다. ( ㉠ )에 들… | [SQLD] SQL 개발자 기출유형 모의고사 10회 상세 페이지
1[SQLD] SQL 개발자 기출유형 모의고사 10회
계약별 청구 합계를 구해 다음 [결과]를 얻으려 한다. ( ㉠ )에 들어갈 식으로 옳은 것은?[계약]
| 계약번호 | 고객명 |
|---|---|
| 301 | 한지우 |
| 302 | 오세린 |
| 303 | 문태오 |
| 304 | 신가람 |
[청구]
| 청구번호 | 계약번호 | 금액 |
|---|---|---|
| 1 | 301 | 100 |
| 2 | 301 | (null) |
| 3 | 302 | 70 |
| 4 | 304 | (null) |
SELECT C.계약번호, C.고객명,
(SELECT ( ㉠ )
FROM 청구 R
WHERE R.계약번호 = C.계약번호) AS 청구합계
FROM 계약 C
ORDER BY C.계약번호;[결과]
| 계약번호 | 고객명 | 청구합계 |
|---|---|---|
| 301 | 한지우 | 100 |
| 302 | 오세린 | 70 |
| 303 | 문태오 | 0 |
| 304 | 신가람 | 0 |
1
SUM(R.금액)
2
SUM(COALESCE(R.금액, 0))
3
COUNT(R.금액)
4
COALESCE(SUM(R.금액), 0)
해설
집계 함수만 있는 스칼라 서브쿼리는 대상 행이 없어도 한 행을 돌려주므로, 그 SUM 결과를 COALESCE(SUM(R.금액), 0) 으로 감싸야 청구가 없는 303도 0이 된다.
301은 NULL 을 뺀 100, 302는 70이고, 금액이 NULL 뿐인 304와 청구가 없는 303은 SUM 이 NULL 이어서 0으로 바뀐다.
- SUM(R.금액) 만 쓰면 303·304가 NULL 로 나온다.
- SUM(COALESCE(R.금액, 0)) 은 304는 0이지만 대상 행이 없는 303은 여전히 NULL 이다.
- COUNT(R.금액) 는 금액이 아닌 건수를 세어 301·302가 1이 된다.
오류나 개정된 내용이 보이면 알려주세요