我有以下示例数据集,该数据集由以下查询创建,该查询根据员工在一个月内是否工作了任何时间将其设置为“活动”或“非活动”。
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 但它没有返回任何结果。 (不报错,只返回空列)
有人知道我错过了什么吗?
答案 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'