[英]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_name
和last_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 ![]() |
---|---|---|---|
John![]() |
Appleseed![]() |
3 ![]() |
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.