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
可能不应该出现在 SELECT
和 GROUP 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> ] )
我正在 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
可能不应该出现在 SELECT
和 GROUP 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> ] )