【问题标题】:Query Sum by Shift in SQL Server在 SQL Server 中按 Shift 查询求和
【发布时间】:2016-06-07 17:03:38
【问题描述】:

我有 3 个表,分别名为 stopdetailshift。我想做点什么,结果可以像图片一样

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

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

提前致谢

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

编辑:

谢谢你告诉我我必须做什么,所以这里是它

桌站:

  1. VehicleID -> varchar
  2. StopStart -> 日期时间
  3. StopEnd -> 日期时间
  4. 持续时间 -> 日期时间(StopEnd - StopStart)

表格详情:

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

表格移位:

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

result i expect 来自它: 一辆车有 3 个班次(1 2 3),并且驾驶怠速停止是从表格停止和细节(细节有状态所以它复杂)的持续时间的总和,它们必须通过班次与表格班次的进出时间相加

我不是查询专家,所以我不知道如何解决这个问题,我所做的查询不好,我只尝试根据停止表进行移位,但我没有不知道怎么用表移位加入它

这是我尝试过的

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

【问题讨论】:

  • 屏幕截图不会有太大区别。发布一些示例数据和相关输出
  • 图片上已有样本数据:D请点击
  • 我们没有责任把所有东西都框起来放在你的盘子里
  • 我想我已经在上面写了这个“我很难做到这一点,请帮助我,如果你们能帮助我,我将不胜感激:D”,因为我对此没有解决方案,这就是为什么我在这里寻求解决方案
  • 欢迎来到 Stackoverflow Irvan。如果您想从其他用户那里获得一些有用的建议,最好包括您的表结构、您已经尝试过的代码、对您的问题的清晰描述、示例数据和预期的输出。你可以在这里找到关于如何写一个好问题的更详尽的描述:stackoverflow.com/help/how-to-ask

标签: sql sql-server datetime sql-server-2005


【解决方案1】:

假设 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 

【讨论】:

  • 我已经尝试过了,但得到了类似这样的错误消息 243,级别 16,状态 1,行 1 类型时间不是定义的系统类型。
  • 删除问题中的 SQL2008 标记并更改为 datetime(并开始使用受支持的 SQL 服务器版本。对 SQL2005 的支持已于 5 年前结束)。
  • 感谢@adrianm,这对我帮助很大,感谢您帮助我解决了这个问题
猜你喜欢
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2019-12-06
  • 2016-01-04
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多