我有一张表:
Date, HoursToWork, Workers_ID, Contract_ID, ContractStartDate
我的目标是总结CURRENT合约的所有时间,因为合约每年每天都会从01.01开始变化。 - 31.12 ..有'n'合同可能。我们可以使用Contract_ID(如果有多个ID,最高ID始终是当前合同)或使用ContractStartDate。我创建的表(见上文)具有以下结构:如果一个工人有两个合同,他每个日期有两个条目。一个用于合同1,一个用于合同2.例如
01-01-2013, 8, 1, 1, 01.01.2013
01-01-2013, 4, 1, 2, 03.05.2013
假设工人每天工作8小时(不考虑假期等),我们会在每个工作日加起来8小时,直到2013年5月2日。现在合同发生了变化,他每天工作4个小时,我们开始在每个工作日增加已经收集的4小时,直到今年年底。
答案 0 :(得分:0)
尝试:
select sum(h.HoursToWork)
from (select max(contract_ID) contract_ID
from contracts_table
where XXX=workers_ID) c
join hours_table h on c.contract_ID = h.contract_ID
答案 1 :(得分:0)
您的澄清是您希望用户使用此功能。要获取当前合同,请使用row_number()
并为每个用户选择最新的ContractId
。然后,只需进行聚合:
select workers_id, ContractId, ContractStartDate, SUM(HoursToWork)
from (select t.*,
ROW_NUMBER() over (partition by Workers_Id order by Contract_id desc) as seqnum
from t
) t
where seqnum = 1
group by workers_id, ContractId, ContractStartDate;
要在您的流程中使用此功能,您需要where Workers_ID = @Workers_Id
之类的内容来选择当前的工作人员。
row_number()
函数为每个工作者的每一行分配一个序号(因为partition by
子句. The first row is the one with the highest contract id (because of the
order by子句。)
答案 2 :(得分:0)
我认为这应该有效:
select Workers_ID, sum(CASE WHEN dt1 is null THEN dt2 ELSE dt1 END) from
(select Workers_ID,
DATEDIFF(DAY,
ContractStartDate,
(select top 1 ContractStartDate from yourTable t2
where t2.Workers_ID=t1.Workers_ID
and t2.ContractStartDate>t1.ContractStartDate)
) * HoursToWork as dt1,
DATEDIFF(DAY,
ContractStartDate,
GetDate()
) * HoursToWork as dt2
from yourTable t1) a
group by Workers_ID
请参阅fiddler