【问题标题】:Troubles with using GROUP BY in SQL Query在 SQL 查询中使用 GROUP BY 的问题
【发布时间】:2015-09-14 14:25:33
【问题描述】:

我正在尝试在 MS SQL Server 中编写适当的 SQL 查询。 首先,我有以下表格:城镇,员工,地址。几乎每个员工都有 Manager,ManagerID 也是员工中的外键。 (自我关系)。我的目标是显示每个城镇的经理人数。到目前为止,我有这个代码:

SELECT t.Name, COUNT(*) AS [Managers from each town] 
FROM Towns t
JOIN Addresses a
ON t.TownID = a.TownID
JOIN Employees e
ON a.AddressID = e.AddressID
GROUP BY t.Name
ORDER BY [Managers from each town] DESC

此查询返回每个城镇的员工人数,而不是经理人数。 如果我尝试下面的第二个查询,我会得到一些完全错误的东西:

SELECT t.Name, COUNT(*) AS [Managers from each town] 
FROM Towns t
JOIN Addresses a
ON t.TownID = a.TownID
JOIN Employees e
ON a.AddressID = e.AddressID
JOIN Employees m
ON e.ManagerID = m.ManagerID

GROUP BY t.Name
ORDER BY [Managers from each town] DESC

这是'Employees'表的结构:

EmployeeID、FirstName、LastName、MiddleName、JobTitle、DepartamentID、ManagerID、HireDate、Salary、AddressID

正确的查询必须返回这个结果集:

Town          | Managers from each town
Issaquah      | 3
Kenmore       | 5
Monroe        | 2
Newport Hills | 1

【问题讨论】:

  • 示例数据会非常有帮助,SQL Fiddle 也是如此。

标签: sql sql-server tsql


【解决方案1】:

如果我正确理解您的结构,则员工是经理的唯一指示是其 id 是否用作其他员工的 managerid。您的第一个查询已经正确显示了计数,那么所需要做的就是用类似的东西过滤结果

where EmployeeID in (select ManagerID from Employees)

因此将您的第一个查询变成:

SELECT t.Name, COUNT(*) AS [Managers from each town] FROM Towns t
JOIN Addresses a
ON t.TownID = a.TownID
JOIN Employees e
ON a.AddressID = e.AddressID
where EmployeeID in (select ManagerID from Employees)
GROUP BY t.Name
ORDER BY [Managers from each town] DESC

【讨论】:

  • 您的回答帮助我改进了 SQL 代码,谢谢
【解决方案2】:

我认为您的原始查询的以下变化应该可以让居住在每个城镇的经理:

SELECT t.Name, COUNT(DISTINCT e.EmployeeId) AS [Managers from each town]
FROM Towns t JOIN
      Addresses a
      ON t.TownID = a.TownID JOIN
      Employees e
      ON a.AddressID = e.AddressID
WHERE e.EmployeeId IN (SELECT e2.ManagerId FROM Employees e2)
GROUP BY t.Name
ORDER BY [Managers from each town] DESC;

DISTINCT 可能不是必须的,但如果不更好地理解数据结构就很难说。

【讨论】:

  • 使用这个过滤器 WHERE e.EmployeeId IN (SELECT e2.ManagerId FROM Employees e2) 我得到了正确的结果。也许再次将所有员工添加到自己不是一个正确的决定。像这里:加入员工 e ON a.AddressID = e.AddressID 加入员工 m ON e.ManagerID = m.ManagerID 非常感谢!
【解决方案3】:

试试:

select t.name,
       count(*) as num_managers
  from employees m
  join addresses a
    on m.addressid = a.addressid
  join towns t
    on a.townid = t.townid
 where exists (select 1 from employees x where x.managerid = m.employeeid)
 group by t.name
 order by 2 desc

【讨论】:

    【解决方案4】:

    您可以尝试以下查询以获得所需的输出...

    select t.TownName, COUNT(*) as No from Town t
    Inner Join Address a on a.TownID = t.TownID
    inner join Employee e on e.ManagerID = a.EmployeeID
    Group By t.TownName
    

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 2018-12-30
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多