2016-12-31 2 views
0

У меня есть три таблицыSQL - Получить счет каждого отдельного значения с условием?

**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 

Каждая смена в комнате есть один врач, и в каждой смене необходима несколько nurse.Nurses работы с графиком врача. Я хочу подсчитать, сколько сдвигов не хватает медсестры в 12-30-2016. Результат должен быть:

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 
+0

Почему doctor_schedule_id 4 не является результатом? – GurV

+0

, потому что у него есть roon_id = 2, в котором нужна 1 медсестра, в (nurse_schedule_id = 4) есть (doctor_schedule_id = 4) – tuanptit

+0

, из которого должно выходить 'nurse_have_in_room'? –

ответ

1

Вы можете INNER JOIN все таблицы, как это и отфильтровать те, где требуемое количество медсестер меньше или равно числу их уже присутствующих.

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); 
+0

'HAVING SUM (r.nurse_needed)> COUNT (n.nurse_schedule_id)' - это кажется неправильным. Это должно быть 'HAVING r.nurse_needed> COUNT (n.nurse_schedule_id)'. –

+0

Я запрашиваю его, и результат показывает, что 'nurse_needed' в комнате ошибочно – tuanptit

+0

@GurwinderSingh показывает тот же результат – tuanptit

1

Вы можете присоединиться к doctor_schedule с room и агрегатных запросов на 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 
+0

Я хочу только рассчитывать в 12-30-2016. В этот день 2 смены не хватает медсестры - это сдвиг 1 и сдвиг 2. – tuanptit

Смежные вопросы