계약별 청구 합계를 구해 다음 [결과]를 얻으려 한다. ( ㉠ )에 들… | [SQLD] SQL 개발자 기출유형 모의고사 10회 상세 페이지

1[SQLD] SQL 개발자 기출유형 모의고사 10회
계약별 청구 합계를 구해 다음 [결과]를 얻으려 한다. ( ㉠ )에 들어갈 식으로 옳은 것은?

[계약]

계약번호고객명
301한지우
302오세린
303문태오
304신가람

[청구]

청구번호계약번호금액
1301100
2301(null)
330270
4304(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이 된다.

오류나 개정된 내용이 보이면 알려주세요

이어서 풀어보기

[SQLD] SQL 개발자 기출유형 모의고사 10회 50문항 이어서 보기문제·정답·해설을 한 페이지에서 이어서 볼 수 있어요SQLD SQL 개발자 실전 모의고사 암기장 전체 보기