SQL Server中按移位查询求和

SQL Server中按移位查询求和,sql,sql-server,datetime,sql-server-2005,Sql,Sql Server,Datetime,Sql Server 2005,我有三张桌子,分别是“停止”、“细节”和“移位”。我想做一些事情,这样的结果可以喜欢的形象 我很难做到这一点,请帮帮我 如果你们能在这方面帮助我,我将不胜感激 提前谢谢 ============================================================= 编辑: 谢谢你告诉我该做什么,就这样 桌位: 车辆ID->varchar 停止开始->日期时间 StopEnd->datetime 持续时间->日期时间停止结束-停止开始 表格详情: 车辆ID->varch

我有三张桌子,分别是“停止”、“细节”和“移位”。我想做一些事情,这样的结果可以喜欢的形象

我很难做到这一点,请帮帮我

如果你们能在这方面帮助我,我将不胜感激

提前谢谢

=============================================================

编辑:

谢谢你告诉我该做什么,就这样

桌位:

车辆ID->varchar 停止开始->日期时间 StopEnd->datetime 持续时间->日期时间停止结束-停止开始 表格详情:

车辆ID->varchar 状态有Idle和Drive->varchar 开始时间->日期时间 停止时间->日期时间 持续时间->日期时间停止时间-开始时间 表移位:

NoShift->int In->datetime只需要几个小时 Out->datetime只需要几个小时 我期望的结果是: 一辆车有3个档位1 2 3,行驶怠速停止时间是表停时间和详细状态的持续时间之和,因此非常复杂,必须根据表停时间和表停时间按档位求和

我不是查询方面的专家,所以,我不知道如何解决这个问题,我正在进行的查询不好,我只尝试在stop table的基础上进行shift,但我不知道如何使用table shift进行join

这就是我尝试过的

Select VehicleID,
Sum((select Duration from stop where DATEPART(hh,[StopStart]) >= 7 AND DATEPART(hh,[StopEnd]) <= 11)) AS Shift1,
Sum((select Duration from stop where DATEPART(hh,[StopStart]) >= 11 AND DATEPART(hh,[StopEnd]) <= 14)) AS Shift2,
Sum((select Duration from stop where DATEPART(hh,[StopStart]) >= 14 AND DATEPART(hh,[StopEnd]) <= 18)) AS Shift3
from Stop
Group By VehicleID

假设starttime决定换档,且行驶/怠速始终在一个换档范围内

CREATE TABLE #Stop (
    VehicleId varchar(10)
   ,StopStart datetime
   ,StopEnd datetime
);

CREATE TABLE #Detail (
    VehicleId varchar(10)
   ,State varchar(10)
   ,StartTime datetime
   ,StopTime datetime
);

CREATE TABLE #Shift (
   Id int
  ,[In] datetime
  ,[Out] datetime
);

INSERT INTO #Stop 
VALUES ('a','7:00','11:00')
      ,('a','11:00','14:00')
      ,('b','7:00','7:00')
      ,('b','14:00','18:00');

INSERT INTO #Detail
VALUES ('a', 'Drive', '7:00', '11:00')
      ,('a', 'Idle', '11:00', '14:00')
      ,('b', 'Drive', '7:00', '7:00')
      ,('b', 'Idle', '14:00', '18:00');


INSERT INTO #Shift 
VALUES (1, '7:00', '11:00')
      ,(2, '11:00', '14:00')
      ,(3, '14:00', '18:00');


WITH DriveDetails AS (
    SELECT Detail.VehicleId
          ,Detail.State
          ,Shift.Id AS ShiftId
          ,SUM(DATEDIFF(minute, Detail.StartTime, Detail.StopTime)) AS DurationMinutes
    FROM #Detail AS Detail
         INNER JOIN #Shift AS Shift
             ON Detail.StartTime BETWEEN Shift.[In] AND Shift.[Out]
    GROUP BY Detail.VehicleId
            ,Detail.State
            ,Shift.Id
)
,Stop AS (
    SELECT Stop.VehicleId
          ,Shift.Id AS ShiftId
          ,SUM(DATEDIFF(minute, Stop.StopStart, Stop.StopEnd)) AS DurationMinutes
    FROM #Stop AS Stop
         INNER JOIN #Shift AS Shift
             ON Stop.StopStart BETWEEN Shift.[In] AND Shift.[Out]
    GROUP BY Stop.VehicleId
            ,Shift.Id
)
,VehicleShifts AS (
    SELECT DISTINCT 
           Detail.VehicleId
          ,Shift.Id AS ShiftId
    FROM #Detail AS Detail
         CROSS JOIN #Shift AS Shift
)
SELECT VehicleShifts.VehicleId
      ,VehicleShifts.ShiftId
      ,CONVERT(time, DATEADD(minute, Drive.DurationMinutes, 0)) AS Drive
      ,CONVERT(time, DATEADD(minute, Idle.DurationMinutes, 0)) AS Idle
      ,CONVERT(time, DATEADD(minute, Stop.DurationMinutes, 0)) AS Stop
FROM VehicleShifts
     LEFT JOIN DriveDetails AS Drive
         ON Drive.VehicleId = VehicleShifts.VehicleId
            AND Drive.ShiftId = VehicleShifts.ShiftId 
            AND Drive.State = 'Drive'
     LEFT JOIN DriveDetails AS Idle
         ON Idle.VehicleId = VehicleShifts.VehicleId
            AND Idle.ShiftId = VehicleShifts.ShiftId 
            AND Idle.State = 'Idle'
     LEFT JOIN Stop 
         ON Stop.VehicleId = VehicleShifts.VehicleId
            AND Stop.ShiftId = VehicleShifts.ShiftId 

屏幕截图不会有太大区别。发布一些样本数据和相关输出样本数据已经在图片上:D请点击它不是我们的职责,框架一切,并在您的平台上服务我想我写了这上面我有困难的时间,请帮助我,我会很感激,如果你们能帮我这个:D,因为我没有解决这个问题的办法,这就是我在这里寻求解决方案的原因欢迎来到斯塔克欧文。如果您想从其他用户那里得到一些有用的建议,最好包括您的表结构、您已经尝试过的代码、问题的清晰描述、示例数据和预期输出。您可以在这里找到关于如何编写一个好问题的更全面的描述:我已经尝试过了,但出现了类似以下错误:Msg 243,级别16,状态1,第1行类型时间不是定义的系统类型。请删除问题中的SQL2008标记,改为datetime,并开始使用受支持的SQL server版本。对SQL2005的支持在5年前就结束了。谢谢@adrianm,这对我帮助很大,谢谢你帮助我解决这个问题