Reputation: 413
I have three tables
**room**
room_id | nurse_needed
----------------------
1 | 3
2 | 1
3 | 2
**doctor_schedule**
doctor_schedule_id| room_id | date |shift
-------------------------------------------------
1 | 1 |12-30-2016| 1
2 | 2 |12-31-2016| 2
3 | 3 |12-30-2016| 2
4 | 2 |12-30-2016| 2
*nurse_schedule*
nurse_schedule_id | doctor_schedule_id
--------------------------------------
1 | 1
2 | 1
3 | 3
Each shift in room have one doctor and in each shift need a number of nurse.Nurses work with doctor's schedule. I want to count how many shift don't have enough nurse in 12-30-2016
. The result should be:
doctor_schedule_id| room_id | date |shift | nurse_needed|nurse_have_in_room
------------------------------------------------------------------------------
1 | 1 |12-30-2016| 1 | 3 | 2
3 | 3 |12-30-2016| 2 | 2 | 1
4 | 2 |12-30-2016| 2 | 1 | 0
Upvotes: 0
Views: 1033
Reputation: 39477
You can INNER JOIN
all the table like this and filter away the ones where required number of nurses is less than or equal to number of them already present.
select d.doctor_schedule_id,
d.room_id,
d.date,
d.shift,
r.nurse_needed,
COUNT(distinct n.nurse_schedule_id) nurse_have_in_room
from doctor_schedule d
inner join room r on r.room_id = d.room_id
left outer join nurse_schedule n on d.doctor_schedule_id = n.doctor_schedule_id
where d.date = '12-30-2016'
group by d.doctor_schedule_id,
d.room_id,
d.date,
d.shift,
r.nurse_needed
having r.nurse_needed > COUNT(distinct n.nurse_schedule_id);
Upvotes: 1
Reputation: 311188
You could join doctor_schedule
with room
and an aggregate query on nurse_schedule
:
SELECT d.*, r.nurse_needed, n.nurses_in_room
FROM doctor_schedule d
JOIN room r ON d.room_id = r.room_id
JOIN (SELECT doctor_schedule_id, COUNT(*) AS nurses_in_room
FROM nurse_schedule
GROUP BY doctor_schedule_id) n ON
d.doctor_schedule_id = n.doctor_schedule_id AND
r.nurse_needed > n.nurses_in_room
Upvotes: 1