使用GROUP BY基于不在GROUP BY语句中的列过滤查询

时间:2017-07-26 19:02:50

标签: sql sql-server tsql

给出以下表结构和示例数据:

+-------------+------+-------------+ | EmployeeID | Name | WorkWeek | +--------------+-------+-----------+ | 1 | A | 1 | | 2 | B | 1 | | 2 | B | 2 | | 3 | C | 1 | | 3 | C | 2 | | 4 | D | 2 | +--------------+-------+-----------+

我希望选择仅在第1周工作的所有员工(因此在此示例中,仅返回employeeid = 1。我可以使用以下查询获取数据:

SELECT EmployeeId, Name FROM SomeTable GROUP BY EmployeeId, Name HAVING SUM ( WorkWeek ) = 1;

对我来说,HAVING SUM( WorkWeek ) = 1是一个黑客,这应该用某种形式的GROUP BYCOUNT处理,但我无法理解该查询的结构。

任何帮助都会有用且具有启发性。

2 个答案:

答案 0 :(得分:2)

HAVING SUM( WorkWeek ) = 1可能适用于第1周或第2周,但第3周会失败(因为1 + 2 = 3)。
使用NOT EXISTS运算符代替子查询:

SELECT  EmployeeId, Name
FROM    SomeTable t1
WHERE NOT EXISTS (
   SELECT * FROM  SomeTable  t2
   WHERE t1.EmployeeId = t2.EmployeeId
     AND t2.WorkWeek  <> 1
)

答案 1 :(得分:0)

实际上,这正是having子句的用法 - 根据聚合值过滤记录。

来自w3schools sql tutorial

  

HAVING子句已添加到SQL,因为WHERE关键字不能与聚合函数一起使用。