같은 표인데 SQL COUNT 결과가 다른 이유

이 카테고리 글 목록

전체글 보기

제출 기록이 몇 행인지 알고 싶다면 COUNT(*)를 쓰세요. 점수가 기록된 행만 세려면 COUNT(score), 서로 다른 점수가 몇 종류인지 알고 싶다면 COUNT(DISTINCT score)를 씁니다. 같은 표에서 세 값이 달라지는 이유는 개수를 세는 대상이 다르기 때문입니다.

점수 다섯 건을 세 가지로 세기

가상의 제출 다섯 건에 점수 7, 7, NULL, 0, NULL이 들어 있습니다. 한 쿼리에서 집계식만 바꿔 결과를 나란히 봅니다.

import sqlite3

db = sqlite3.connect(":memory:")
counts = db.execute("""
    WITH submissions(score) AS (VALUES (7), (7), (NULL), (0), (NULL))
    SELECT COUNT(*) AS row_count,
           COUNT(score) AS scored_count,
           COUNT(DISTINCT score) AS distinct_scores
    FROM submissions
""").fetchone()
print("rows scored distinct")
print(*counts)
db.close()
rows scored distinct
5 3 2
  • COUNT(*)는 제출 행 다섯 개를 모두 셉니다. 점수가 비어 있는 두 행도 제출 건수에는 포함됩니다.
  • COUNT(score)는 점수가 NULL인 두 행을 빼고 7, 7, 0을 셉니다. 0은 기록된 점수입니다.
  • COUNT(DISTINCT score)는 NULL을 세지 않고, 같은 7을 한 종류로 취급합니다. 남는 점수는 0과 7입니다.

같은 7점을 받은 두 제출을 각각 세야 한다면 두 번째 식이 맞습니다. 점수가 몇 종류 나왔는지가 질문이면 세 번째 식을 쓰세요. 집계 결과의 열 이름을 scored_count나 distinct_scores처럼 붙이면 보고서에서 어떤 개수인지 다시 확인하기 쉽습니다.

가상 입력은 Windows의 Python 3.14.3 내장 sqlite3에서 SQLite 3.50.4로 실행했습니다. 집계의 정의는 SQLite의 COUNT 문서에서 확인할 수 있습니다.

이 카테고리의 다른 글

전체글 보기

댓글 남기기