SQL 服务器数据库中的计数函数能否接受多个值

CAN THE COUNT FUNCTION IN SQL SERVER DB ACCEPT MULTIPLE VALUES

我正在 SSMS 中查询非常流行的 AdventureWorks 数据库。 我 objective 从 HumanResources.Employee.

中查找每个职位下的男性和女性人数

为此,我最初的查询是,

SELECT JobTitle,
COUNT(CASE WHEN Gender='M' THEN 1
ELSE 0
END) AS MALE_COUNT,
COUNT(CASE WHEN Gender='F' THEN 1
ELSE 0
END) AS FEMALE_COUNT,Gender
FROM HumanResources.Employee
GROUP BY JobTitle,Gender
ORDER BY JobTitle
GO

但是,通过如下修改,我得到了上面 query.So 的错误答案,我得到了想要的结果:

SELECT JobTitle,
COUNT(CASE WHEN Gender='M' THEN 1
END) AS MALE_COUNT,
COUNT(CASE WHEN Gender='F' THEN 1
END) AS FEMALE_COUNT,Gender
FROM HumanResources.Employee
GROUP BY JobTitle,Gender
ORDER BY JobTitle
GO

很容易看出,我只是删除了两个 CASE 语句的 'ELSE 0' 条件,但我无法弄清楚“0”如何影响结果中返回的值。

谁能给我解释一下这两者的区别?另外我想知道 COUNT 函数是如何取多个值的,通常情况下(比如 SELECT COUNT(3,3))它不起作用。

你想要 SUM(),而不是 COUNT():后者考虑了每个非 null 值(包括 0),所以你当前的条件表达式很重要所有行 - 相当于 COUNT(*)

此外,我怀疑 gender 可能不应该出现在 SELECTGROUP BY 子句中,因为这正是您要聚合的内容

我想你想要:

SELECT 
    JobTitle,
    SUM(CASE WHEN Gender='M' THEN 1 ELSE 0 END) AS MALE_COUNT,
    SUM(CASE WHEN Gender='F' THEN 1 ELSE 0 END) AS FEMALE_COUNT
FROM HumanResources.Employee
GROUP BY JobTitle
ORDER BY JobTitle

文档说:

COUNT(ALL expression) evaluates expression for each row in a group, and returns the number of nonnull values.

在此处阅读更多内容:https://docs.microsoft.com/en-us/sql/t-sql/functions/count-transact-sql?view=sql-server-ver15

所以我们可以将您的查询重写为:

SELECT 
    JobTitle,
    COUNT(CASE WHEN Gender='M' THEN 1 ELSE NULL END) AS MALE_COUNT,
    COUNT(CASE WHEN Gender='F' THEN 1 ELSE NULL END) AS FEMALE_COUNT
FROM HumanResources.Employee
GROUP BY JobTitle
ORDER BY JobTitle

关于您的查询:

第一次查询:

在 Count 函数中,您有一个 CASE 表达式,它将 'M' 更改为 1,将 'F' 更改为 0。然后 COUNT 函数将执行计数操作他们。因为 1 和 0 都不是 NULL 所以 Count 将 return 记录总数,无论 'M' 或 'F'

此过程与第二个 CASE 相同。

第二次查询:

Count 函数中,您有一个 CASE 表达式,它将 'M' 更改为 1,但您没有提到如何处理其他值,因此 NULL 将是 returned 用于非 M 值。之后 Count 函数将对这些记录进行计数操作,并将 return M 的数量。(第二个查询等于我发布的查询,它们都有相同的输出。但是由于可读性,我更喜欢我的查询而不是你的查询:-))

此过程与第二个 CASE 相同。

CASE 表达式的文档说:

ELSE else_result_expression Is the expression returned if no comparison operation evaluates to TRUE. If this argument is omitted and no comparison operation evaluates to TRUE, CASE returns NULL. else_result_expression is any valid expression. The data types of else_result_expression and any result_expression must be the same or must be an implicit conversion.

在此处阅读更多内容:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-ver15

SELECT 计数(3,3)

这在语法上是错误的,会给你一个这样的错误,这是不言自明的:

Msg 174, Level 15, State 1, Line 1 The Count function requires 1 argument(s)

基于上述文档的 Count 函数的语法如下:

-- Aggregation Function Syntax  
COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )  

-- Analytic Function Syntax  
COUNT ( [ ALL ]  { expression | * } ) OVER ( [ <partition_by_clause> ] )