技术与生活 / 一篇记录
报表数量对不上,检查 COUNT 的对象
一列允许 NULL 时,已存在的记录不一定拥有该列的值。统计记录总量和统计已填写某字段的数量,应使用不同表达式,才能让业务口径与结果一致。
COUNT(*) 统计行数,COUNT(列) 不统计该列为 NULL 的行。
实际怎么检查
查询示例以 SQLite 为例;notes 为测试表,包含 id、title、score、category、created_at 字段。
SELECT COUNT(*) AS rows, COUNT(score) AS scored FROM notes;
插入一条 score 为空的样本,比较两个结果。
遇到异常再检查什么
在测试表加入零分、空值和正常分数三种记录,比较结果。不要把 COUNT(score) 理解成分数总和,需要总和时应使用 SUM 并单独处理空集。
统计去重值时,还要明确大小写和空值规则。两个看起来相近的字符串是否代表同一对象,取决于业务口径与数据库比较规则,不能在报表末尾再凭经验修正数量。
NULL 不是空字符串,也不是数值零。
参考:SQL 文档。