如何累积tsql II的值

如何累积tsql II的值,sql,tsql,sql-server-2012,Sql,Tsql,Sql Server 2012,我必须解决一个问题,但不知道怎么做。我正在使用SQLServer2012 我有如下模式的数据: ----------------------------------------------------------------------------------- DriverId | BeginDate | EndDate | NextBegin | Rest | Drive Time | Drive | |

我必须解决一个问题,但不知道怎么做。我正在使用SQLServer2012

我有如下模式的数据:

 -----------------------------------------------------------------------------------
   DriverId  | BeginDate | EndDate | NextBegin | Rest         | Drive Time | Drive
             |           |         | Date      | in minutes   | in seconds | KM            
 -----------------------------------------------------------------------------------
    integer     datetime   datetime   datetime    integer          integer     decimal(10,3)

   Rest in hours = EndDate - NextBeginDate
   Drive Time in Minutes = BeginDate - EndDate

   I have to search the BeginWorkDay first rest => 10 hours then
   BWD = BeginWorkDay
   EWD = EndWorkDay


   Do
     Compute how many minutes have the workDay (Diff between BWD and EWD) 
     SUM(DriveTime) as TotalDayDrive
     MAX(DriveTime) as MaxDriveDayPeriod
     SUM(Rest) as TotalDayRest
     Rest as NightRest
     MAX(Rest) as MaxDayRest
     Min(Rest) as MinDayRest
     SUM(TotalKM) as KM
   until next rest => 10 hours
   IF No More Rest EXIT DO
   Loop

Desired Result:

Driver     Plate    Begin Work Day            End Work Day             WorkDayTime(minu)
11953512       IVA870   2014-01-06 00:47:01.000   2014-01-06 11:08:32.000  621

DriveTime(seconds)   MaxDayDrive(sec)   TotalDayRest(minu)   NightRest(minu)   MinDayRest(minu)   
19081            3786               304              2.259             14              

MaxDayRest(minu)   KM
89                 138.200


DATA FILE                           
                Minutes Seconds 
DriverId   Plate   BeginDate    EndDate      NextBeginDate   Rest   DriveTime   DriveKM
11953512   IVA870  2014-01-04   2014-01-04   2014-01-06      2.259  2038    13.400
                   10:34:42.000 11:08:40.000 00:47:01.000    

11953512   IVA870  2014-01-06   2014-01-06   2014-01-06      89     2615    34.500
                   00:47:01.000 01:30:36.000 02:59:08.000   

11953512   IVA870  2014-01-06   2014-01-06   2014-01-06      51     2604    19.000
                   02:59:08.000 03:42:32.000 04:33:56.000

11953512   IVA870  2014-01-06   2014-01-06   2014-01-06      18     2294    17.500
                   04:33:56.000 05:12:10.000 05:30:42.000

11953512   IVA870  2014-01-06   2014-01-06   2014-01-06      47     2895    20.500
                   05:30:42.000 06:18:57.000 07:05:56.000    

11953512   IVA870  2014-01-06   2014-01-06   2014-01-06      47     2819    19.800
                   07:05:56.000 07:52:55.000 08:39:51.000   

11953512   IVA870  2014-01-06   2014-01-06   2014-01-06      14     239         0.300
                   08:39:51.000 08:43:50.000 08:57:05.000    

11953512   IVA870  2014-01-06   2014-01-06   2014-01-06      38     3786    18.000
                   08:57:05.000 10:00:11.000 10:38:03.000

11953512   IVA870  2014-01-06   2014-01-06   2014-01-07     843     1829    8.900
                   10:38:03.000 11:08:32.000 01:11:04.000   
还有一个主题是如何积累tsql中的值,Jerrad编写了一个魅力脚本,解决了一个类似的问题,但我无法想象如何修改它来解决这个问题

我有excel表格中的数据,您可以从这里下载:


我为我的英语感到抱歉,我希望你能理解并帮助我,提前谢谢你。

首先你需要确定每天组成的行。我将根据BeginDate和NextBeginDate将您的数据表连接到自身。这将为您提供每天的开始和结束日期时间。我把结果储存在CTE里

;with cte
as(
    select d.DriverId, 
    d.Matricula, 
    d.BeginDate DayBeginDate,
    (select MAX(EndDate) from Drive d3 where d3.DriverId = d.DriverId and d3.EndDate < DATEADD(d, 1, DATEDIFF(d, 0, d.BeginDate))) DayEndDate
    from Drive d 
    join Drive d2 on d.BeginDate = d2.NextBeginDate
    where d2.Rest > 600
)
现在只需要根据CTE中的开始和结束日期时间,从主数据表中选择各种聚合

select d.DriverId, 
d.Matricula, 
d.DayBeginDate, 
d.DayEndDate,
DATEDIFF(N, d.DayBeginDate, d.DayEndDate) WorkDayTime,
(select SUM(d2.DriveTime) from Drive d2 where d2.DriverId = d.DriverId and d2.BeginDate >= d.DayBeginDate and d2.EndDate <= d.DayEndDate) DriveTime,
(select MAX(d2.DriveTime) from Drive d2 where d2.DriverId = d.DriverId and d2.BeginDate >= d.DayBeginDate and d2.EndDate <= d.DayEndDate) MaxDayDrive,
(select SUM(d2.Rest) from Drive d2 where d2.DriverId = d.DriverId and d2.BeginDate >= d.DayBeginDate and d2.EndDate < d.DayEndDate) TotalDayRest,
DATEDIFF(N, (select MAX(d2.EndDate) from Drive d2 where d2.DriverId = d.DriverId and d2.EndDate < d.DayBeginDate), d.DayBeginDate) NightRest,
(select MIN(d2.Rest) from Drive d2 where d2.DriverId = d.DriverId and d2.BeginDate >= d.DayBeginDate and d2.EndDate < d.DayEndDate) MinDayRest,
(select MAX(d2.Rest) from Drive d2 where d2.DriverId = d.DriverId and d2.BeginDate >= d.DayBeginDate and d2.EndDate < d.DayEndDate) MaxDayRest,
(select SUM(d2.DriveKM) from Drive d2 where d2.DriverId = d.DriverId and d2.BeginDate >= d.DayBeginDate and d2.EndDate <= d.DayEndDate) KM
from cte d 
group by d.DriverId, d.Matricula, d.DayBeginDate, d.DayEndDate

编辑您的问题并添加示例数据和所需结果。Gordon Linoff,在excel中,您将找到示例数据和所需结果。谢谢。@Capanga您应该在问题中包含示例数据和所需结果,而不是在外部链接中。如果链接每断一次,这对任何有类似问题的人都没有帮助。对不起,蓝脚怪,但问题中的数据太多了。我将把总数据的一小部分放进去。谢谢你的评论。我很失望,你很快就取消了我的问题,但没有帮助。不用谢。我认为,这样我们就不会帮助任何人。最好闭上我的嘴。嗨,杰瑞德,非常感谢你的帮助。稍后我将测试这个程序。我会留下评论的。嗨,Jerrad,关于SQL Fiddle的工作很好,但是在我的电脑里我有时间格式问题,它把2014-01-06 11:08:00作为2014-01-06 23:08:00,你能帮我解决这个问题吗?结果是1372而不是621。非常感谢。表中的数据是否正确,只是查询显示的时间错误?是否从Excel文件导入SQL Server中的数据?是的,直接从表中复制的数据。如果我查阅表格,我的电脑上的数据显示为2014-01-06 11:08:00,但您创建的查询结果是2014-01-06 23:08:00,仅在我的电脑上有相同的记录。第一个是正常的,第二个是错误的。我不知道为什么,我的电脑设置是24小时格式的西班牙。只有我的电脑上的查询是错误的,但在SQL FIDLE中是可以的。我的表的结束日期:2014-01-06 11:08:32.000