【问题标题】:SQL Select employees with work history in multiple statesSQL 选择具有多个州工作历史的员工
【发布时间】:2015-03-18 21:00:44
【问题描述】:

我需要一个仅显示在多个州获得报酬的员工的查询。

查询将拉取三列:

  1. 员工 ID
  2. 工作地点
  3. 最后付款日期

我目前的失败尝试:

Select EmployeeID
    , WorkLocation
    , max(LastPayDate)
from Table 
group by EmployeeID, WorkLocation
having COUNT(distinct WorkLocation) > 1

此查询提取零记录。但是,我知道有些员工曾在多个州工作过。我不确定我的逻辑在哪里崩溃。

非常感谢任何指导。

【问题讨论】:

  • 发布的查询应该返回 0 而不是全部
  • having COUNT(distinct EmployeeID) > 1 应该返回 0 行而不是所有行,因为每一行都按 EmployeeID WorkLocation 分组,并且只有一个值。
  • 你能评论编辑过的帖子@MartinSmith吗?

标签: sql sql-server count distinct self-join


【解决方案1】:

您需要有一个 count(workLocation) > 1,这表明他们已经在超过 1 个状态下工作。在 HAVING 子句中指定这一点。因为您只关心包含多个 WorkLocation 的 GROUPS。

如果您尝试检查特定年份内的多个工作地点,您将在 WHERE 子句中执行该逻辑。

select EmployeeId
from table xyz
//where year(LastPayDate) == 2015
group by EmployeeId 
having count(distinct WorkLocation) > 1

【讨论】:

  • 这将返回所有具有多于一行的EmployeeId - 对于任何(非空)WorkLocation - 不一定是不同的。
  • 更改为having count(distinct WorkLocation) > 1,这应该可以正常工作
  • 这很好。如何在记录中还包括 WorkLocation 和 LastPayDate? @贾斯汀丹尼尔森
  • 使用分组依据时,只有在使用聚合函数时才能包含列。
【解决方案2】:

想通了。我需要使用子查询。解决方法如下:

Select t.EmployeeID
     , t.WorkLocation
     , t.LastPayDate
From Table t
Where t.EmployeeID in
    (
     Select t2.EmployeeID
     From Table t2
     Group by t2.EmployeeID
     Having count(distinct t2.WorkLocation) > 1
    )
Group by t.EmployeeID, t.WorkLocation
Order by t.EmployeeID

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多