SQL에서 주택 거래건수를 COUNT(금액)으로 세면 금액이 빈 행도 포함되나
발행
SQL에서 주택 거래건수를 COUNT(금액)으로 세면 금액이 빈 행도 포함되나
SQL에서 COUNT(금액)은 거래행 전체를 세는 표현이 아니다. 그 금액 열이 NULL이 아닌 행을 센다. 거래 ID가 존재하지만 금액이 비어 있는 행이 있다면 COUNT(*)와 결과가 다를 수 있다. 보고서에서 ‘전체 거래건수’와 ‘금액이 확인된 거래건수’를 서로 다른 이름으로 두어야 한다.
세 행인데 금액 개수는 두 개
가상 거래표에 ID A의 금액 100, B의 금액 NULL, C의 금액 0이 있다고 하자. 입력행은 세 개이므로 COUNT(*)는 3이다. COUNT(금액)은 NULL인 B를 제외하고 A와 C를 세어 2다. 금액 0은 값이 존재하는 것이어서 자동으로 제외되지 않는다. NULL을 무조건 0으로 바꾸면 COUNT(금액)도 3이 되어 ‘확인된 금액’의 의미가 달라진다.
같은 표에서 NULL이 아닌 금액 합은 100이다. PostgreSQL의 AVG는 비결측값을 대상으로 계산하므로 금액 평균은 100÷2=50이다. 거래행 수 3을 별도 분모로 써서 약 33.33을 만들면 다른 계산이 된다. 어떤 것이 필요한지는 누락 금액을 어떻게 해석할지에 달려 있으며, 계산을 맞추려고 누락 가격을 실제 0원 거래처럼 만들어서는 안 된다.
집계 전후의 분모를 남긴다
PostgreSQL 공식 Aggregate Functions 표가 count(*)와 count(표현식), avg의 대상을 구별한다. 위 숫자는 그 규칙을 적용한 자체 가상 표이며 실제 운영 데이터베이스를 조회하거나 주택 거래를 집계한 결과가 아니다. 데이터베이스 종류와 자료형, 앞 단계의 필터에 따라 입력행 자체가 달라질 수 있어 실제 환경도 확인한다.
검산표에는 필터 후 전체 ID 수, 금액 비결측 행 수, 금액 NULL 행 수를 함께 둔다. 기본키에 중복이 있으면 행 수와 고유 거래 수가 또 다르므로 COUNT(*)를 곧바로 고유 거래건수라고 부르지 않는다. 그룹 키가 NULL인 행이 빠지는 문제와 금액 열의 NULL을 세지 않는 문제도 구분한다. 같은 합계를 얻었더라도 분모와 결측 처리 기준을 설명할 수 있어야 월별 평균이나 지역 비교를 재현할 수 있다.
출처와 확인일
- PostgreSQL Aggregate Functions — 확인일 2026-10-16 KST