【问题标题】:How do I use COUNT, COUNTIF or SUM in a WHERE clause?如何在 WHERE 子句中使用 COUNT、COUNTIF 或 SUM?
【发布时间】:2018-08-17 16:18:58
【问题描述】:

我有一个员工表,我正在尝试获取没有在职员工的部门 ID 列表。

我的第一次尝试是:

SELECT DISTINCT DivisionID
FROM Employees
WHERE COUNT(IsActive = 0) = 0
GROUP BY DivisionID

但 Count 不允许表达式,尽管智能感知说它允许。

然后我尝试了:

SELECT DISTINCT DivisionID
FROM Employees
WHERE SUM(CAST(IsActive AS INT)) = 0
GROUP BY DivisionID

但随后它会抱怨“聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且正在聚合的列是外部引用。”

这似乎应该是直截了当的,不确定问题是什么。

【问题讨论】:

  • 尝试拥有而不是在哪里。在 group by 子句之后
  • where 子句用于过滤行。 Have 子句用于限制聚合行。
  • 请注意,DISTINCT 是不必要的,因为这是您分组依据的列。根据定义,您只会获得不同的 ID。

标签: sql sql-server sql-server-2012


【解决方案1】:

使用having,您可以使用条件聚合过滤您分组的记录

SELECT DivisionID
FROM Employees    
GROUP BY DivisionID
HAVING sum(case when IsActive = 1 then 1 else 0 end) = 0

【讨论】:

  • 不,可能不会。
  • IsActive 列不在group by 子句中。那么,我们如何在having 子句中使用它。我从错误短语中了解到的。否则,我需要了解having 子句吗?
  • 它在一个聚合函数中-> sum()
  • 是的。它是正确的。我第一次面对这个案子。非常感谢@juergen
【解决方案2】:

我怀疑这是你想要的:

SELECT DivisionID
FROM Employees
GROUP BY DivisionID
HAVING MAX(IsActive) = 0

【讨论】:

  • 希望 Max 函数会随着记录的增长而减慢查询速度?
  • @RinsadAhmed 。 . .不会。GROUP BY 会影响性能。这应该是做你想做的最简单的方法。
  • 请注意,如果IsActiveBIT,则需要进行转换,因为工程师以其无限的智慧决定不允许MAX 访问BIT
【解决方案3】:
SELECT DivisionID
from (
    SELECT DivisionID, count(*) as tmpcount from Employees WHERE IsActive=0 group by 
    DivisionID 
) 
WHERE tmpcount>0

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 2017-05-20
    • 2010-09-23
    • 1970-01-01
    • 2017-12-17
    • 2015-11-03
    • 2011-06-17
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多