2015-11-01 4 views
0

Привет У меня есть сомнения в SQL серверенужна помощь запроса в SQL Server 2008

Table : patient 
patientno | refdoctor| loccode | status | sdate 
100   | 31  |10  | 1  | 2012-05-03 
100   | 32  |10  | 1  |1997-02-04 
100   | 36  |10  | 1  |2014-09-16 
100   |35  |10  | 1  |2013-05-03 
100   | 50  |10  | 1  | 1988-05-08 
100   | 20  |10  | 2  |2015-02-05 

Table : targetpatient 

patientno | refdoctor| loccode | status | sdate 
100   | 21  | 10  | 2  | 2004-05-18 
100   | 23  | 10  | 2  |2005-07-25 
100   | 24  | 10  | 2  | 2006-06-22 
100   | 26  | 10  | 2  |2012-05-14 
100   | 28  |10  | 2  |2013-05-03 
100   |29  |10  | 2  | 2014-09-26 
100   | 33  | 10  | 2  | 2012-10-22 
100   | 39  | 10  | 2  |2002-12-13 
100   |41  | 10  | 2  |2012-05-13 

Здесь я хочу таблица вывода пациента относится состояние

statusvalue = 5 в SDATE меньше или равна checkvalue = 2-х SDATE и разница между датами должно быть меньше, чем 30 дней, то с учетом количества , если это условие не упадет, то подсчет должен быть вернуть ноль (0)

select o.patientno,o.loccode,o.status,o.sDate, count(*) as cnt 
from patient o join targetpatient t on o.patientno=t.patientno and o.loccode=t.loccode and o.status in('1') and t.status in('2') and 
o.sDate<=t.sdate 
and datediff(dd,o.sdate,t.sdate)<=30 
group by o.patientno,o.loccode,o.status,o.sDate 

based on above query I got result like below: 

patientno | loccode | status | sdate  | count 
100   | 10  | 1  |2012-05-03 | 2 
100   | 10  | 1  |2013-05-03 | 1 
100   | 10  | 1  |2014-09-16 | 1 

but I want expected result like below 

patientno | loccode | status | sdate  | count 
100   | 10  | 1  |2012-05-03 | 2 
100   | 10  | 1  |2013-05-03 | 1 
100   | 10  | 1  |2014-09-16 | 1 
100   | 10  | 1  | 1997-02-04 | 0 
100   | 10  |1  | 1988-05-08 | 0 

, пожалуйста, расскажите, как написать запрос, чтобы выполнить эту задачу на сервере sql.

ответ

0

Если вы хотите включить записи, которые не имеют какие-либо совпадений в присоединяемой таблице вы хотите использовать left join вместо этого и сделать count на колонке в присоединяемых таблицах вместо так:

select o.patientno,o.loccode,o.status,o.sDate, count(t.sdate) as cnt 
from patient o 
left join targetpatient t on o.patientno = t.patientno 
         and o.loccode = t.loccode 
         and o.status in('1') 
         and t.status in('2') 
         and o.sDate <= t.sdate 
         and datediff(dd,o.sdate,t.sdate) <= 30 
group by o.patientno,o.loccode,o.status,o.sDate 

A left join вернет все строки из таблицы с левой стороны (patient в вашем случае), а также соответствующие строки из правого бокового стола. Строки, которые не имеют совпадений в правой таблице, получат нулевые значения.

+0

@ user5509775 Боюсь, я не понимаю. Предоставленный вами запрос дает результат, который вы использовали в качестве примера (до того, как вы отредактировали вопрос). Это неправильно? – jpw

+0

Привет Его работая отлично. Спасибо! – user5509775