2012-01-16 1 views
2

У меня есть следующая таблица:сумма отсчет дней во многих интервалах

CREATE table DataDiff (CLI tinyint, id tinyint, date datetime, countable bit) 
insert into DataDiff values (234,1,convert(datetime,'17/12/1997',103),1) 
insert into DataDiff values (234,2,convert(datetime,'09/07/1998',103),0) 
insert into DataDiff values (234,3,convert(datetime,'11/08/1998',103),1) 
insert into DataDiff values (234,4,convert(datetime,'29/12/1998',103),0) 
insert into DataDiff values (234,5,convert(datetime,'01/02/1999',103),1) 
insert into DataDiff values (234,6,convert(datetime,'03/02/1999',103),0) 
insert into DataDiff values (234,7,convert(datetime,'03/02/1999',103),1) 
insert into DataDiff values (234,8,convert(datetime,'29/03/1999',103),0) 
insert into DataDiff values (234,9,convert(datetime,'29/03/1999',103),1) 
insert into DataDiff values (234,10,convert(datetime,'31/03/1999',103),0) 

Я с трудом переписывания, без RBAR, UDF считать дни с ID = 1 до ID = 2 затем от ID = 3 до ID = 4 и т. д., всегда начиная счетчик, когда COUNTABLE = 1 и останавливается, когда COUNTABLE = 0, а затем возвращает сумму для данного CLI.

Длина в дни пяти интервалов, изображенных является:

ID=2 - ID=1 = 204 
ID=4 - ID=3 = 140 
ID=6 - ID=5 = 2 
ID=8 - ID=7 = 54 
ID=10 -ID=9 = 2 

в общей сложности 402 «счетных» дней от общего количества 469 дней между ID = 1 и J = 10

+0

Что делать, если у вас есть нечетное количество дней? –

+0

@ Justin Satyr Вы имеете в виду, если последний COUNTABLE = 1? Ну, в этом случае это до сегодняшнего дня. –

+0

Вы действительно не определили, что такое 'COUNTABLE'. –

ответ

3

Try :

select t1.cli , 
     sum(t1.countable * 
      datediff(day, t1.[DATE], coalesce(t2.[DATE],getdate()))) daycount 
from DataDiff t1 
left join DataDiff t2 on t1.cli = t2.cli and t1.id+1 = t2.id 
group by t1.cli 

(Подразумевается, что если последняя записанная дата кли счетно, то оно должно быть подсчитаны до текущей даты.)

+0

Это может быть немного не по теме, извините, но для того, чтобы быть уверенным, что я хорошо понимаю вашу идею и, возможно, также буду уверенно делать себя достаточно ясно в подобных случаях в будущем: когда вы («вы» = «люди, которые говорят по-английски как их первый язык ») говорят« до ... (некоторая дата) », имеет ли это какое-либо значение в отношении того, включена ли« какая-то дата »или исключена из диапазона, или нет такой импликации по умолчанию? Раньше я думал, что это * подразумевается, и дата была включена, но если бы я теперь судил по вашему запросу, казалось бы, это было бы просто наоборот. –

+0

@AndriyM: Я думаю, что «до» будет * стремиться * означать * включая * последнюю дату, но это не обязательно будет определенным - контекст может дать разъяснения. В этом случае я предположил, что текущая дата является следующей * применимой * датой. –

+0

О, так что, в конце концов, это * до * своего контекста, я вижу. :) Имеет смысл, большое спасибо! –