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