Sql 需要查询一些复杂的聚合吗

Sql 需要查询一些复杂的聚合吗,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); de

我还没有找到一种优雅的方法来解决这个问题,所以我想请你帮我计算特定月份的平均每周工作时间

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
有人愿意帮我吗?
Azure SQL上的am

这假设每月最多有一次小时变化。如果你有更多,那么你就需要更复杂的比例计算

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  

我不确定我是否理解这些数据。72,'2017-09-01','2017-11-13',20这是否意味着此人在这段时间内每周有20个小时?或者在那段时间内的总小时数?每一天如果每周工作20小时,那么将时间结束在11-13天似乎是任意的。如果它在半个星期结束呢?是的,它意味着每周几个小时。全日制是每周38.5小时。我们只在周一更改周时数,所以这应该没有问题。与此同时,我确实提出了一个查询,但它并不总是有效的,因为它只在每个人的周时数发生更改时有效:选择m.ym,p1.pers_id,IsNullcastdayp2。[to]as float/30*p2.hrs+cast31-dayp3。[from]as float/30*p3.hrs,p1.hrs from@months m left join@person p1 on m.ym在p1.[from]和IsNullp1.[to]之间,GetDate left join@person p2 on p2.pers_id=p1.pers_id和p2.[to]在m.ym和Dateaddmm之间,1,m.ym left join@person p3 on p3.pers_id=p2.pers_id和p3.[from]在m.ym和Dateaddmm之间,1,m.ym请不要在评论中张贴代码。您应该编辑您的问题并添加此内容。这些评论的格式很糟糕。不过,我看到了一些关于这个问题的担忧。嗨!这很有效。但我应该写:假设每个月最多有30天。因此,2月应以28 | 29天计算。因此,我将您查询中的30替换为:IIFDAYEOMONTHym>30,30,DAYEOMONTHym,似乎正在工作。谢谢你,伙计!