【问题标题】:Get count of each id in SQL Server获取 SQL Server 中每个 id 的计数
【发布时间】:2018-10-19 11:40:03
【问题描述】:

我有以下表格

dbo.员工

id          name      position_id      phone
-----------------------------------------------   
1           Gosho         1            5623565
2           Pesho         2            095656
3           Misho         3            0984654

dbo.repairs

id          service_id  client_id   employee_id    dt      price
----------- ----------- ----------- ----------- ---------- ------
3           1           2           1           2003-05-03 4.54
4           2           1           2           2013-05-03 3.55
5           1           2           1           2003-05-03 4.54
6           2           1           2           2013-05-03 3.55
7           1           2           1           2003-05-03 4.54
8           2           1           2           2013-05-03 3.55
9           1           2           1           2003-05-03 4.54
10          2           1           2           2013-05-03 3.55

我想查看每个员工的维修次数。

我想要的结果应该是这样的:

employee_id  repairs_count
--------------------------
1             4
2             4

这是我想出的代码

SELECT 
    COUNT(r.employee_id)
FROM
    repairs r
LEFT JOIN 
    repairs e ON r.id = e.id
WHERE 
    r.id = e.id

提前致谢!

【问题讨论】:

  • 提示:当 LEFT JOIN 时,在 ON 子句中有连接条件 - 并且只有一次。
  • 那么...在他们的id 上加入repairsrepairs 有什么意义???你会得到完全相同的记录。

标签: sql sql-server count sum


【解决方案1】:

employee_id 分组。 count() 等聚合函数适用于每个组

select employee_id, count(*) as repairs_count
from repairs
group by employee_id

【讨论】:

    【解决方案2】:

    如果您只关心进行维修的员工(如您的示例结果中所示),那么您不需要join

    select r.employee_id, count(*) as cnt
    from dbo.repairs r
    group by r.employee_id;
    

    如果您想要所有员工,即使是没有维修的员工,请使用left join

    select e.id, count(r.employee_id) as cnt
    from dbo.employees e left join
         dbo.repairs r
         on e.employee_id = r.employee_id
    group by e.id;
    

    【讨论】:

      【解决方案3】:

      使用 JOIN 从员工表中添加更多信息

      SELECT 
         employee_id = e.id,
         e.name, 
         repairs_count = COUNT(r.id)
      FROM
         dbo.employee e
         LEFT JOIN
         dbo.repairs r ON e.id = r.employee_id
      GROUP BY
         e.id, e.name
      HAVING
         COUNT(r.id) > 0
      

      【讨论】:

      • HAVING 子句没有区别。
      • @jarlh 对于 EmployeeID = 3?
      • 没有区别。 (count(*) 计算行数,不管是否有空值。)
      • having 在这个查询中有什么用处?
      • 员工 ID 3 没有维修。问题不要求零维修的员工。所以它被过滤掉了
      【解决方案4】:

      有几种方法可以解决这个问题

      分组

      select e.id,
             e.name,
             e.position_id,
             e.phone,
             count(*) as repairs_count
      from   employee e
        left outer join repairs r on e.id = r.employeeid
      group by e.id, e.name, e.position_id, e.phone
      

      注意:如果您想省略没有维修的员工,只需将左连接替换为内连接

      或通过子查询

      select e.id,
             e.name,
             e.position_id,
             e.phone,
             (select count(1) from repairs r where r.employeeid = e.id) as repairs_count
      from   employee e
      

      我会选择第一个选项,因为优化器将更容易使用索引,并且更容易排除没有维修的员工(如果你想要的话)

      【讨论】:

        猜你喜欢
        • 2016-01-12
        • 1970-01-01
        • 2015-07-25
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2021-11-23
        • 2012-08-10
        • 1970-01-01
        相关资源
        最近更新 更多