【问题标题】:SQL Server - For each distinct company count the number of employeesSQL Server - 对于每个不同的公司计算员工人数
【发布时间】:2015-02-16 19:11:12
【问题描述】:

我正在尝试创建一些 SQL 来计算每个公司内的员工人数,并只返回那些员工人数大于或等于 n 的公司。

我有以下表格(简体):

CompanyEmployee Table

ID    Name         IsCompany
1     John Joe     0
2     Company Y    1
3     Company X    1
4     Sally Jeff   0
5     James Peach  0

Employment Table
ID    EmployeeID    CompanyID
1     1             2
2     4             3
3     5             3

n=2 我想要的结果:

ID    Name         IsCompany
3     Company X    1

我有以下 SQL:

SELECT t.* FROM CompanyEmployee AS t 
WHERE t.ID IN ( 
  SELECT DISTINCT (t.ID) 
  FROM CompanyEmployee AS t  
  INNER JOIN Employment AS t0 ON t.ID = t0.CompanyID 
  WHERE t.IsCompany = 1
  GROUP BY t0.CompanyID
  HAVING COUNT(t0.EmployeeID) >= n)

但它会产生以下错误:

Column 'CompanyEmployee.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

任何帮助或建议将不胜感激!

【问题讨论】:

  • “不起作用”是什么意思?
  • 我已更新问题以包含错误。

标签: sql sql-server count distinct


【解决方案1】:

以这种方式混合公司和员工是一个坏主意。只要两种不同类型的行之间的 id 值从不相交,就可以使用直接内连接。我想如果它是一个身份列,那么这不应该发生。

with Companies as (
    select ID as CompanyID, Name
    from CompanyEmployee
    where IsCompany = 1
), Employees as (
    select CompanyID, Name
    from CompanyEmployee where
    IsCompany = 0
)
select c.CompanyID, Name, 1 as IsCompany
from
    Companies as c
    inner join Employment as ec on ec.CompanyID = c.CompanyID
    inner join Employees as e on e.EmployeeID = ce.EmployeeID
group by
    c.CompanyID
having count(*) >= n

仍然有一个简单的方法来做到这一点:

select *
from CompanyEmployee
where ID in (
    select CompanyID
    from Employment
    group by CompanyID
    having count(*) >= n)
)

【讨论】:

  • 同意第一句话,但是我真的很讨厌使用 IN 子句,因为它的“性能”;)赞成!
  • 我敢打赌查询计划非常相似。优化器擅长以这种方式转换子查询。
  • @Maciej 我想您可能会想到 SQL Server 的旧版本中存在问题。在现代版本中,IN 的优化通常与EXISTS 完全相同。
【解决方案2】:

试试这个:

SELECT t1.CompanyId, t2.CompanyName, COUNT(t1.CompanyId)
FROM Employment AS t1 INNER JOIN CompanyEmployee AS t2 ON t1.CompanyId = t2.Id
GROUP BY t1.CompanyId, t2.CompanyName
HAVING COUNT(t1.CompanyId)>=n

其中 n 是员工人数...

【讨论】:

  • 已更新...对不起,我是直接写的;)
  • 谢谢!这很有效,但是 shawnt00 提供了一个更简单的解决方案。
  • 我不认为这更简单,但是......决定权属于你;)
  • *更适用于我的项目:P
猜你喜欢
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2021-09-20
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多