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