GROUPS 和 NULL 的 COUNT 不等于表中的总行数
Posted
技术标签:
【中文标题】GROUPS 和 NULL 的 COUNT 不等于表中的总行数【英文标题】:COUNT of GROUPS and NULLs don't add up to total rows in the table 【发布时间】:2021-11-03 05:18:41 【问题描述】:GROUPS
和 NULL
s 中的 COUNT
不等于表中的总行数。
我首先想知道,也许 SQL Server 总行数可能会关闭(我是新手),所以我想通过在 RentalID
列上运行 COUNT
来进行仔细检查,然后检查 @ 987654326@ 值只是为了验证名为AllData
的表中的总行数是否准确。所有结果都同意;该表共有 3,471,007 行。
然后我使用GROUP BY
对Gender
列中的所有值运行COUNT
,然后在该列中分别运行COUNT
的NULL
s。我希望当我将这三个加在一起时,该数字将与表中的总行数匹配,但事实并非如此。差 3,444。
这是我的代码的副本:
-- HOW MANY TOTAL ROWS IN THE TABLE? -------------------------------
SELECT *
FROM AllData
-- 3,471,007 rows
-- HOW MANY total RentalIDs ARE THERE? -----------------------------
SELECT RentalID
FROM AllData
-- 3,471,007 rows.
-- How many UNIQUE RentalIDs ARE THERE? ----------------------------
SELECT COUNT(DISTINCT(RentalID))
FROM AllData
-- 3,471,007 rows. Means no missing RentalIDs.
-- HOW IS GENDER POPULATED?
SELECT Gender, COUNT(Gender) AS GenderCount
FROM AllData
GROUP BY Gender
/* Results:
Gender GenderCount
NULL 0
Male 2174743
Female 737307
*/
-- HOW MANY ROWS ARE MISSING GENDER? -------------------------------
SELECT Gender
FROM AllData
WHERE Gender IS NULL
-- 562,401 rows are empty.
/* Why don't these numbers add up to total rows in table?
2,174,743 Count of Gender = Male
737,307 Count of Gender = Female
562,401 Count of Gender = NULL
3,474,451 This should equal total rows in table, but it doesn't
3,471,007 Total rows in table
3,444 Difference: these rows not accounted for... */
【问题讨论】:
有些事情没有意义,因为当您group by
性别时,您会得到 0 行 null,而根据您的以下查询,您应该得到 562,401 行。
如何调查 NULL 返回 0 的原因?
将 count(Gender)
更改为 count(*)
- 当您指定列名时,它会忽略空值。
啊!因此,进行更改后,返回的结果为 558,957,这与性别为 null 的查询的结果不匹配。
性别数据类型为(nvarchar(50), null)
【参考方案1】:
SELECT Gender, COUNT(Gender) AS GenderCount
FROM AllData
GROUP BY Gender
上述语句在性别上对NULL
给出0,因为COUNT
函数不会计算NULL
值。因此,您可以选择以下任何一种方法
推荐方法
SELECT Gender, COUNT(1) AS GenderCount
FROM AllData
GROUP BY Gender
备选方案#1
SELECT Gender, COUNT(*) AS GenderCount
FROM AllData
GROUP BY Gender
备选方案#2
SELECT Gender, COUNT(ISNULL(Gender,'')) AS GenderCount
FROM AllData
GROUP BY Gender
【讨论】:
为什么推荐使用COUNT(1)
?您告诉 DBMS 为表中的每一行生成表达式 1
并检查此表达式是否导致 NULL 或必须计算在内。您要做的就是计算行数,这仅仅是COUNT(*)
。仅将 COUNT(<expression>)
用于可以为 null 并且您只想计算非 null 出现次数的表达式。
@ThorstenKettner 因为在 SQL Server 中,COUNT(someconstant)
的编译方式与 COUNT(*)
相同,您可以通过查看查询计划来验证这一点。有些人更喜欢COUNT(1)
,因为它使每一行都被计算在内变得更加明显
@Charlieface:是的,我知道 SQL Server 有一个优化器可以检测到COUNT(someconstant)
,幸运的是,它为我们将其转换为COUNT(*)
。但是“计数”比“计数行”更明显吗?在我看来不是这样。我们还可以使用SUM(1)
将行数相加,直到获得总行数。但我也不会使用这个。如果我想计算行数,我使用“COUNT rows”(SQL 中的COUNT(*)
);如果我想计算一些表达式,我使用COUNT(expression)
。好吧,我只是不明白这一点,似乎:D以上是关于GROUPS 和 NULL 的 COUNT 不等于表中的总行数的主要内容,如果未能解决你的问题,请参考以下文章
python blender-groups-by-vert-count.py
假设单元格B1为文本100.单元格B2为数值3,则COUNT(B1:B2)等于