在 SQL 服务器中按 Shift 查询总和
Query Sum by Shift in SQL Server
我有 3 个 table 叫做 stop
、detail
和 shift
。我想做点什么让结果像图片一样
我很难做到这一点,请帮助我。
如果你们能帮助我,我将不胜感激:D
提前致谢
============================================= ================
编辑:
谢谢你告诉我我必须做什么,就在这里
Table 停止:
- VehicleID -> varchar
- 停止开始 -> 日期时间
- 停止结束 -> 日期时间
- 持续时间 -> 日期时间 (StopEnd - StopStart)
Table 详情:
- VehicleID -> varchar
- 状态(有空闲和驱动)-> varchar
- 开始时间 -> 日期时间
- 停止时间 -> 日期时间
- 持续时间 -> 日期时间(停止时间 - 开始时间)
Table 班次:
- NoShift -> 整数
- 在 -> 日期时间(只需要几个小时)
- 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
我有 3 个 table 叫做 stop
、detail
和 shift
。我想做点什么让结果像图片一样
我很难做到这一点,请帮助我。
如果你们能帮助我,我将不胜感激:D
提前致谢
============================================= ================
编辑:
谢谢你告诉我我必须做什么,就在这里
Table 停止:
- VehicleID -> varchar
- 停止开始 -> 日期时间
- 停止结束 -> 日期时间
- 持续时间 -> 日期时间 (StopEnd - StopStart)
Table 详情:
- VehicleID -> varchar
- 状态(有空闲和驱动)-> varchar
- 开始时间 -> 日期时间
- 停止时间 -> 日期时间
- 持续时间 -> 日期时间(停止时间 - 开始时间)
Table 班次:
- NoShift -> 整数
- 在 -> 日期时间(只需要几个小时)
- 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