简体   繁体   English

SQL 计算多行中来自另一个表的 id 的出现次数

[英]SQL count occurrences of an id from another table in multiple rows

TABLE 1 employee:表 1 员工:

employee_id, first_name, last_name
     2           John    Appleseed

TABLE 2 performance_review:表 2 performance_review:

employee_id, reviewer_id
     2            1
     2            3
     2            4
     1            2
     3            2 

QUESTION: print the first_name and last_name in a single row, then how many times that id is found in the employee_id column, then how many times that same id is found in the reviewer_id column.问题:在一行中打印first_namelast_name ,然后在employee_id列中找到该 ID 的次数,然后在reviewer_id列中找到相同的 ID 的次数。

Example output:示例 output:

Name               Employee_id count   Received_review count
-------------------------------------------------------------
John Appleseed              3                2

What I got so far (it doesn't work)到目前为止我得到了什么(它不起作用)

SELECT 
    CONCAT([employee_first_name], ' ' , [employee_last_name]) AS employee_full_name, 
    (SELECT COUNT(employee.employee_id) 
     FROM performance_review AS received_review 
     LEFT JOIN performance_review ON employee.employee_id = performance_review.employee_id) AS received_reviews
FROM 
    employee

Since this involves separate aggregation over two different columns you need two subqueries, one for each.由于这涉及对两个不同列的单独聚合,因此您需要两个子查询,每个子查询一个。

Here is an example [edit] left joins should be used here because the inner joins would fail for example if the performance review table has all rows with null reviewer for a particular employee.这是一个示例 [edit] 应该在此处使用左联接,因为例如,如果绩效评估表的所有行都包含特定员工的 null 审阅者,则内部联接将失败。

with 
  emp as (select employee_id,count(*) employee_count 
          from performance_review 
          group by employee_id),
  rev as (select reviewer_id,count(*) reviewer_count 
          from performance_review 
          group by reviewer_id) 
select 
  first_name,
  last_name,
  employee_count,
  reviewer_count
from 
 employee 
left join emp on employee.employee_id=emp.employee_id 
left join rev on employee.employee_id=rev.reviewer_id;

The result结果

first_name last_name employee_count员工人数 reviewer_count reviewer_count
John约翰 Appleseed苹果籽 3 3个 2 2个

Robert's answer is the clearest way to do it but I thought I would show another way to do it with a join -- here you use a trick of doing a test and sum to count certain items.罗伯特的回答是最清楚的方法,但我想我会展示另一种方法来使用连接——在这里你使用一个技巧来做测试和求和来计算某些项目。 I join both cases我加入这两种情况

   SELECT e.first_name, e.last_name,
          SUM(CASE WHEN e.employee_id = p.employee_id THEN 1 ELSE 0 END) as employee_count,
          SUM(CASE WHEN e.employee_id = p.reviewer_id THEN 1 ELSE 0 END) as reviewer_count
   FROM employee e
   LEFT JOIN performance_review p on e.employee_id = p.reviewer_id
                                  or e.employee_id = p.employee_id
   GROUP BY e.first_name, e.last_name

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM