如何累积tsql的值
我必须解决一个问题,但不知道怎么做。我正在使用SQLServer2012 我有如下模式的数据:如何累积tsql的值,tsql,sql-server-2012,Tsql,Sql Server 2012,我必须解决一个问题,但不知道怎么做。我正在使用SQLServer2012 我有如下模式的数据: ----------------------------------------------------------------------------------- DriverId | BeginDate | EndDate | NextBegin | Rest in | Drive Time | Drive | | | Da
-----------------------------------------------------------------------------------
DriverId | BeginDate | EndDate | NextBegin | Rest in | Drive Time | Drive
| | | Date | Hours | in Minutes | KM
-----------------------------------------------------------------------------------
integer datetime datetime datetime integer integer decimal(10,3)
Rest in hours = EndDate - NextBeginDate
Drive Time in Minutes = BeginDate - EndDate
我必须搜索第一个rest=>36小时
Do
Compute how many days are
SUM(DriveTime)
SUM(TotalKM)
until next rest => 36 hours
IF No More Rest EXIT DO
Loop
从头到尾都是被抛弃的
从最后一次休息到最后一次是放弃
我有excel表格中的数据,您可以从这里下载:
我为我的英语感到抱歉,我希望你能理解并帮助我,提前谢谢你。查询有几个部分。第一部分提取Rest大于等于36的行,并指定一个行号。结果存储在名为BigRest的CTE中
with BigRest(RowNumber, DriverId, BeginDate, EndDate)
as
(
select ROW_NUMBER() over(partition by d.DriverId order by d.DriverId, d.BeginDate) RowNumber,d.DriverId, d.BeginDate, d.EndDate
from Drive d
where d.Rest >= 36
)
然后,我根据BeginDate将BigRest中的行号分配给驱动器中的每一行(我称之为包含所有数据的表)。因此,数据按休息时间>=36的天数进行有效分割。每个段都有一个名为DriveGroup的数字
;with Grouped(DriverId, BeginDate, EndDate, DriveTime, DriveKM, DriveGroup)
as
(
select d.DriverId, d.BeginDate, d.EndDate, d.Drivetime, d.DriveKM, (select Top 1 RowNumber from BigRest b where b.DriverId = d.DriverId and b.BeginDate >= d.BeginDate order by b.BeginDate)
from Drive d
)
最后,我从分组中选择数据,将其与自身的一些聚合数据交叉应用。我们可以过滤掉DriveGroup为1或null的行,因为这些行表示无关紧要的开始行和结束行(“不做任何事情”行)
这里有一个
我鼓励您在查询的每个步骤中查看结果,以了解实际情况。此表上是否有主键?谢谢您的提问,没有定义,但可以有。根据Excel文件中的数据,您希望结果是什么样的?我需要一行:DriverId、BeginDate(在其余部分之后)、EndDate(在下一次休息之前)、天(休息之间)、和(驾驶时间)(休息之间)、和(公里)(休息之间)。希望我解释得很好。我修改了excel,所以你可以在表格底部看到一个示例。再次感谢你。Jerrad,谢谢你。我明天会试试这个并发表评论。Jerrad,非常感谢,这正是我需要的,效果非常好。当我完成这份报告时,我必须再做一个,像这样,但有一些变体,是一天的总和。再次感谢。嗨,Jerrad,我发布了另一个类似的问题,我称之为如何累积值tsql,可能是,你可以修改这个脚本并帮助我解决它。提前谢谢你。
select distinct DriverId, MinBeginDate BeginDate, MaxEndDate EndDate, DATEDIFF(D, MinBeginDate, MaxEndDate)+1 Days, DriveTimeSum Drive, DriveKMSum KM
from
(
select g.DriverId, g.BeginDate, g.EndDate, g.DriveGroup, g.DriveTime, c.DriveTimeSum, c.DriveKMSum, c.MinBeginDate, c.MaxEndDate
from Grouped g
cross apply(select SUM(g2.DriveTime) DriveTimeSum,
SUM(g2.DriveKM) DriveKMSum,
MIN(g2.BeginDate) MinBeginDate,
MAX(g2.EndDate) MaxEndDate
from Grouped g2
where g2.DriverId = g.DriverId
and g2.DriveGroup = g.DriveGroup) as c
where g.DriveGroup is not null
and g.DriveGroup > 1
) x