【问题标题】:SQL count number of occurrences in different tablesSQL 统计不同表中出现的次数
【发布时间】:2021-04-17 02:30:24
【问题描述】:

我的数据库中有 4 个表:传入信件、传出信件、本地信件和员工。在 "letters" 表中,有一个 register_employee 已经注册了这封信。

每个员工都有自己的唯一 ID(例如“3de9a23e-b927-4a27-a66a-c1f30b8c1464”)。

表格如下所示:

employee:
 id         first_name    last_name   age  

incoming:
 id      register_employee  summary     letter   adress   date_sent 

“传出”和“本地”表看起来与“传入”表相同。

我需要计算每个员工注册了多少封信以及注册的类型。

示例结果:

employee      incoming  outgoing  local 
Bob Marley      45        33        5
John Travolta   31        10        9
George Bush     98        15        38

我尝试使用完全联接和嵌套的 Select 语句,但我得到的结果可能是错误的,因为我为每个员工获得了数百万个计数(我在 db 中没有这么多字母)。

【问题讨论】:

    标签: sql postgresql count


    【解决方案1】:

    您可以使用OUTER JOINGROUP BY,如下所示:

    -- 更新

    你可以使用多个子查询:

    select e.id, e.firstname,
           (select count(*) from incoming i where i.register_employee  = e.id) as incoming_letter,
           (select count(*) from outgoing o where o.register_employee  = e.id) as outgoing_letter,
           (select count(*) from local l where l.register_employee  = e.id) as local_letter
      from employee e
    

    【讨论】:

    • 不幸的是它不起作用,我仍然得到很大的数字。所有表格的数字也相同link
    • 显示您使用的确切查询以及结果
    • 我找到了问题的解决方案(我发布了一个答案),但我会试试你的,因为我的解决方案似乎有很多无用的操作。我现在会尝试并告诉你它是否有效。 @大力水手
    【解决方案2】:

    我们计算不同类别下的字母数量并将它们加入到主员工表中

    select employee.first_name , t1.incoming, t2.outgoing, t3.local from (    
        select * from employee 
        left join
        (select register_employee, count(*) as incoming from incoming_letters group by register_employee) t1 on employee.id = t1.register_employee
        left join
        (select register_employee, count(*) as outgoing from outgoing_letters group by register_employee) t2 on  employee.id = t2.register_employee
        left join
        (select register_employee, count(*) as local from local group by register_employee) t3 on employee.id = t3.register_employee ) v
    

    【讨论】:

      【解决方案3】:
      SELECT incom.id,incom.name,incom.incoming,out.outgoings,loc.local
      FROM (SELECT 
              employees.id             as id,
              employees.short_name     as name,
              COUNT(incomings.register_employee) as incoming
            FROM employees
            LEFT JOIN incomings ON incomings.register_employee = employees.id)
            GROUP BY employees.id, employees.short_name) as incom
      LEFT JOIN (SELECT 
                   employees.id  as id,
                   COUNT(outgoings.register_employee) as outgoings
            FROM employees
            LEFT JOIN outgoings ON outgoings.register_employee = employees.id
            GROUP BY employees.id) as out
      ON incom.id=out.id
      LEFT JOIN (SELECT 
                   employees.id  as id,
                   COUNT(local.register_employee) as local
            FROM employees
            LEFT JOIN outgoings ON local.register_employee = employees.id
            GROUP BY employees.id) as loc
      ON incom.id=loc.id;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 2014-01-17
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 2021-05-21
        • 1970-01-01
        相关资源
        最近更新 更多