带有 Where 子句的 SQL Case 表达式

时间:2021-03-03 19:13:42

标签: sql sql-server tsql group-by case

我有以下示例数据集,该数据集由以下查询创建,该查询根据员工在一个月内是否工作了任何时间将其设置为“活动”或“非活动”。

Select  Concat([First Name],' ', [Last Name]) AS 'FullName',
CASE (SUM([Week 1] + [Week 2] + [Week 3] + [Week 4]))
        When 0 Then 'Inactive'
        ELSE 'Active'
END [Status]
From dbo.hours
Group by [first name], [last name]
<头>
全名 状态
艾伦布鲁尔 活跃
亚历杭德罗·麦圭尔 无效
亚历克斯·内伯格 活跃

我正在尝试删除所有“活动”状态行,以便我的查询仅显示“非活动”状态行。我试图在 FROM 和 GROUP BY 表达式之间添加 WHERE Status = Inactive 但它没有返回任何结果。 (不报错,只返回空列)

有人知道我错过了什么吗?

3 个答案:

答案 0 :(得分:0)

您不能像那样在 WHERE 列上添加 Status 条件,因为它不适用于 WHERE 子句..您可以将该查询用作内联视图并执行外部查询中的条件检查如

select * from (
Select  Concat([First Name],' ', [Last Name]) AS 'FullName',
CASE (SUM([Week 1] + [Week 2] + [Week 3] + [Week 4]))
        When 0 Then 'Inactive'
        ELSE 'Active'
END [Status]
From dbo.hours
Group by [first name], [last name] ) xxx
where Status != 'Active';

答案 1 :(得分:0)

您需要一个 HAVING 子句,但对于您的要求,您也不需要 CASE 表达式:

SELECT  CONCAT([First Name],' ', [Last Name]) AS FullName,
        'Inactive' [Status]
FROM dbo.hours
GROUP BY [first name], [last name]
HAVING SUM([Week 1] + [Week 2] + [Week 3] + [Week 4]) = 0

答案 2 :(得分:0)

CTE 也能正常工作:

with cte as(
Select  Concat([First Name],' ', [Last Name]) AS 'FullName',
CASE (SUM([Week 1] + [Week 2] + [Week 3] + [Week 4]))
        When 0 Then 'Inactive'
        ELSE 'Active'
END [Status]
From dbo.hours
Group by [first name], [last name])
select FullName from cte where Status <> 'Active'
相关问题