总和值取决于日期

时间:2013-06-04 14:45:35

标签: sql sql-server

我有一张表:

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小时,直到今年年底。

3 个答案:

答案 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