Sql 取决于日期的总和值

Sql 取决于日期的总和值,sql,sql-server,Sql,Sql Server,我有一张桌子: 日期、工时、工人ID、合同ID、合同开始日期 我的目标是计算当前合同的所有小时数,因为从01.01开始,合同每年每天都会发生变化。-31.12.. 可能存在“n”个合同。我们可以使用合同ID(如果有多个ID,则最高ID始终为当前合同)或合同开始日期。我创建的表(见上文)具有以下结构:如果一个工人有两份合同,那么他在每个日期有两个条目。一个用于合同1,一个用于合同2。e、 g 01-01-2013, 8, 1, 1, 01.01.2013 01-01-2013, 4, 1, 2,

我有一张桌子:

日期、工时、工人ID、合同ID、合同开始日期


我的目标是计算当前合同的所有小时数,因为从01.01开始,合同每年每天都会发生变化。-31.12.. 可能存在“n”个合同。我们可以使用合同ID(如果有多个ID,则最高ID始终为当前合同)或合同开始日期。我创建的表(见上文)具有以下结构:如果一个工人有两份合同,那么他在每个日期有两个条目。一个用于合同1,一个用于合同2。e、 g

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小时的工作时间,直到年底。

试试:

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

您的澄清是,您希望由用户执行此操作。要获取当前合同,请使用
行编号()
并为每个用户选择最新的
合同。然后,只需进行聚合:

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\u ID=@Workers\u ID
的内容来选择当前工作人员


row\u number()
函数为每个工人的每一行分配一个序号(因为
子句划分
。第一行是合同id最高的一行(因为
按`子句排序)。

我想这应该可以:

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

请参见

,您的问题是……?“我的目标是对当前合同的所有小时进行汇总”我不知道如何实现这一目标。对于指定的工人?对于所有工人?您是否希望每个工人都有一个汇总?对于所有工人都有一个汇总?是否有一个单独的合同表?到目前为止您尝试了什么?我想要一个特定工人的汇总(登录到服务器的那个人,我有一个小脚本来了解这一点,所以我在末尾加上了'where XXX=workers\u ID'。有一个单独的表格,用于包含contract\u ID和contract startdate的合同。我迄今为止所做的尝试。我试图实现这个想法:每天按contract\u ID对每个条目进行排序(如果一个工人有多个合同id)并删除Top1条目后的条目,但由于sql对我来说不是一个“家庭游戏”,它最终陷入混乱。太好了,这正是我需要的,我还学习了新命令。理解它后,我只需添加“按工人id划分,日期”即可。非常感谢!