2016-02-07 8 views
0

У меня есть таблица подопечногоКак вычесть два столбца в другой таблице

ward_number | class | capacity 
________________________________________ 
1   | A1 | 1 
2   | A1 | 2 
3   | B1 | 3 
4   | C  | 4 
5   | B2 | 5 

емкость = сколько коек есть в палате

У меня также есть таблица под названием ward_stay:

ward_number | from_date | to_date 
_____________________________________________ 
2   | 2015-01-01 | 2015-03-08 
3   | 2015-01-16 | 2015-02-18 
6   | 2015-03-05 | 2015-03-18 
3   | 2015-04-15 | 2015-04-20 
1   | 2015-05-19 | 2015-05-30 

Я хочу рассчитать количество кроватей в палате с классом 'B1' на дату '2015-04-15':

ward_number | count 
_____________________ 
    3   | 2  

Как получить счетчик в основном емкость - количество раз ward_number 3 появляется

мне удалось получить несколько раз ward_number 3 появляется, но я не знаю, как вычесть емкость из этого результата.

Вот мой код:

select count(ward_number) AS 'result' 
from ward_stay 
where ward_number = (select ward_number 
        from ward 
        where class = 'B1'); 

Как вычесть емкость из этого результата?

+1

Какая СУБД вы используете? ('AS 'result'' недопустим SQL) –

+0

В 2015-05-19, в палатах B1 есть три кровати. Как вы получаете значение «1»? –

+0

@ GordonLinoff «Емкость» относится к тому, сколько коек может удерживать палата. Поскольку 'ward_number' в таблице ward_stay появляется 2 раза (так что в этой палате уже 2 пациента, поэтому используются 2 кровати), я получаю значение« 1 ». – Minchae

ответ

0
select w.ward_number, 
    w.capacity - count(ws.ward_number) AS "result" 
from ward as w left join ward_stay as ws 
on ws.ward_number = w.ward_number 
and date '2015-05-19' between ws.from_date and ws.to_date 
where w.class = 'B1' -- which class 
    -- bed not occupied on that date 
group by w.ward_number, w.capacity 
having w.capacity - count(*) > 0 -- only available wards 

См fiddle

+0

, вероятно, нужно «левое соединение», когда все кровати бесплатны. –

+0

@JuanCarlosOropeza: Да, конечно, исправил это. – dnoeth

+0

Я пробовал вставлять дату, когда все кровати бесплатны, однако никаких результатов не было. (даже с «левым соединением») любая идея почему? но правильные результаты были отображены, хотя, если не все кровати свободны – Minchae

1

SQL Fiddle Demo

Использование 2015-01-17 вместо рассчитать общее количество occupied постели в тот же день. Затем присоединитесь к выписке из оригинала capacity. в случае, если все кровати могут освободить LEFT JOIN вернутся NULL, так COALESCE поставит 0

SELECT w."ward_number", "capacity" - COALESCE(occupied, 0) as "count" 
FROM wards w 
LEFT JOIN (
     SELECT "ward_number", COUNT(*) occupied 
     FROM ward_stay 
     WHERE to_date('2015-01-17', 'yyyy-mm-dd') BETWEEN "from_date" and "to_date" 
     GROUP BY "ward_number" 
    ) o  
    ON w."ward_number" = o."ward_number" 
WHERE w."class" = 'B1' 

ВЫВОД

| ward_number | count | 
|-------------|-------| 
|   3 |  2 | 
0

Вам необходимо агрегировать как таблицы, прежде чем вернуться, потому что у вас есть несколько строк для одного и того же типа слова в обоих. Итак:

select c.class, (c.capacity - coalesce(wc.occupied)) as available 
from (select class, sum(capacity) as capacity 
     from ward 
     group by class 
    ) c left join 
    (select w.class, count(*) as occupied 
     from ward_stay ws join 
      ward s 
     on ws.ward_number = w.ward_number and 
     '2015-05-19' between ws.from_date and ws.to_date 
    ) wc 
    on w.class = wc.class; 

Примечание: это стандартный SQL, за исключением константы даты. Это работает в большинстве баз данных; некоторые могут иметь другие форматы (или это может зависеть от настроек интернационализации).

Строго говоря, агрегация на ward не требуется для «B1». Но это явно необходимо для «А1».

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