/ / Потрібний запит для дещо складної агрегації - sql, sql-server

Потрібний запит для дещо складної агрегації - sql, sql-server

Я не знайшов способу вирішити це (елегантним способом), тому я хотів би звернутися за допомогою до розрахунку середніх тижнів за певний місяць.

declare @person table (pers_id int, [from] date, [to] date, hrs decimal(4, 2));
insert into @person values (72, "2017-09-01", "2017-11-13", 20);
insert into @person values (72, "2017-11-14", null, 35);

declare @months table (ym date);
insert into @months values ("2017-09-01");
insert into @months values ("2017-10-01");
insert into @months values ("2017-11-01");
insert into @months values ("2017-12-01");

/* so I need a query whouch would output average week-hours: */
2017-09-01 = 20
2017-10-01 = 20
2017-11-01 = 28.5
= (13/30)*20 + (17/30)*35 ; (assumed each month has 30 days)
2017-12-01 = 35

Хто-небудь готовий допомогти мені? (am на SQL Azure)

Відповіді:

1 для відповіді № 1

Це передбачає щонайбільше одну зміну годин на місяць. Якщо у вас більше, то вам потрібно більше складних обчислень навколо пропорцій

select
start,
round(sum(

case
when [from]>[start] then (datediff(d,[from],finish)+1) * hrs/days
when [to]<[finish] then (datediff(d,start,[to])+1) * hrs/days
else hrs end
),2)
from
(select ym as start, EOMONTH(ym) as finish,
30
--datepart(d, EOMONTH(ym))
as days from @months) months
inner join (    select pers_id, [from], isnull([to], EOMONTH(getdate()))as[to], hrs from @person) p
on months.finish>=p.[from] and months.start<=p.[to]
group by start