在 SQL 服务器中按 Shift 查询总和

Query Sum by Shift in SQL Server

我有 3 个 table 叫做 stopdetailshift。我想做点什么让结果像图片一样

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

如果你们能帮助我,我将不胜感激:D

提前致谢

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

编辑:

谢谢你告诉我我必须做什么,就在这里

Table 停止:

  1. VehicleID -> varchar
  2. 停止开始 -> 日期时间
  3. 停止结束 -> 日期时间
  4. 持续时间 -> 日期时间 (StopEnd - StopStart)

Table 详情:

  1. VehicleID -> varchar
  2. 状态(有空闲和驱动)-> varchar
  3. 开始时间 -> 日期时间
  4. 停止时间 -> 日期时间
  5. 持续时间 -> 日期时间(停止时间 - 开始时间)

Table 班次:

  1. NoShift -> 整数
  2. 在 -> 日期时间(只需要几个小时)
  3. Out -> datetime(只需要几个小时)

result i expect 来自于它: 一辆车有 3 个班次 (1 2 3) 并且驱动怠速停止是从 table 停止和细节的持续时间的总和(细节有状态所以它很复杂)并且它们必须按班次与时间 In 和 Out 相加来自 table 转变

我不是查询方面的专家所以,我不知道如何解决这个问题,我做的查询不好,我只试过在停止时进行换档table, 但我不知道如何用 table shift

加入它

这是我试过的

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

假设开始时间决定班次并且drive/idle总是在一个班次内。

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