Reputation: 85
I have the following tables
dbo.employee
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
I want to view how many repairs there are for each employee.
The result that I am aiming for should be something like this:
employee_id repairs_count
--------------------------
1 4
2 4
Here is my code that i came up with
SELECT
COUNT(r.employee_id)
FROM
repairs r
LEFT JOIN
repairs e ON r.id = e.id
WHERE
r.id = e.id
Thanks in advance !
Upvotes: 2
Views: 1652
Reputation: 12049
There are several ways to solve this
group by
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
NOTE: if you want to leave out employees that have no repairs, simply replace the left join by an inner join
or by subquery
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
I would go for the first option since the optimizer will have it easier to use indexes and its easier to leave out employees that have no repairs should you want that
Upvotes: 0
Reputation: 432471
using a JOIN to add more informations from the employee table
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
Upvotes: 1
Reputation: 1270513
If you only care about employees with repairs -- as in your sample results -- then you don't need a join
:
select r.employee_id, count(*) as cnt
from dbo.repairs r
group by r.employee_id;
If you want all employees, even those with no repairs, then use a 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;
Upvotes: 3
Reputation: 204864
Group by employee_id
. Aggregate functions like count()
apply to each group
select employee_id, count(*) as repairs_count
from repairs
group by employee_id
Upvotes: 4