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 【问题描述】:

GROUPSNULLs 中的 COUNT 不等于表中的总行数。

我首先想知道,也许 SQL Server 总行数可能会关闭(我是新手),所以我想通过在 RentalID 列上运行 COUNT 来进行仔细检查,然后检查 @ 987654326@ 值只是为了验证名为AllData 的表中的总行数是否准确。所有结果都同意;该表共有 3,471,007 行。

然后我使用GROUP BYGender 列中的所有值运行COUNT,然后在该列中分别运行COUNTNULLs。我希望当我将这三个加在一起时,该数字将与表中的总行数匹配,但事实并非如此。差 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 不等于表中的总行数的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GROUPs COUNT 中获取 MAX 值

如何判断所有的checkbox中是不是有选中的?

python blender-groups-by-vert-count.py

假设单元格B1为文本100.单元格B2为数值3,则COUNT(B1:B2)等于

假设单元格B1为文本100.单元格B2为数值3,则COUNT(B1:B2)等于

Mysql sum(if())和count(if())的用法