SQL Server:从同一个表中但不同数据集的字段计算字段数据

时间:2011-09-26 15:01:25

标签: sql-server-2008 field

2 个答案:

答案 0 :(得分:2)

递归CTE解决方案 - 假设每个Vehicle_No只出现在表格中一次:

DECLARE @t TABLE
(Vehicle_No  INT
,Stop1_DepTime   INT
,Segment_TravelTime INT 
,Stop_Sequence  INT
,Stop_arrTime INT
)
INSERT @t (Vehicle_No,Stop1_DepTime,Segment_TravelTime,Stop_Sequence)
VALUES(201,13000,60,1),
(201,13000,45,2),
(201,13000,120,3),
(201,13000,NULL,4),
(202,13300,240,1),
(202,13300,60,2)


;WITH recCTE
AS
(
    SELECT Vehicle_No, Stop1_DepTime, Segment_TravelTime,Stop_Sequence, Stop1_DepTime AS Stop_arrTime
    FROM    @t
    WHERE   Stop_Sequence = 1

    UNION ALL

    SELECT t.Vehicle_No, t.Stop1_DepTime, t.Segment_TravelTime,t.Stop_Sequence, r.Stop_arrTime + r.Segment_TravelTime  AS Stop_arrTime
    FROM    recCTE AS r
    JOIN    @t AS t
    ON      t.Vehicle_No = r.Vehicle_No
    AND     t.Stop_Sequence = r.Stop_Sequence + 1
)
SELECT Vehicle_No, Stop1_DepTime, Segment_TravelTime,Stop_Sequence, Stop1_DepTime,
CASE WHEN Stop_arrTime = Stop1_DepTime THEN NULL ELSE Stop_arrTime END AS Stop_arrTime
FROM recCTE
ORDER BY Vehicle_No, Stop_Sequence

修改 OP查询的更正版本 - 请注意,不必完全限定列名称:

;WITH recCTE
AS
(
    SELECT  Zaehl_Fahrt_Id,  PlanAbfahrtStart,  Fahrzeit, L32.Sequenz,  PlanAbfahrtStart AS Stop_arrTime
    FROM     ZAEHL_2011.dbo.L32
    WHERE    Sequenz = 1

    UNION ALL

    SELECT t.Zaehl_Fahrt_Id, t.PlanAbfahrtStart, t.Fahrzeit,t.Sequenz, r.Stop_arrTime + r.Fahrzeit  AS Stop_arrTime
    FROM    recCTE AS r
    JOIN     ZAEHL_2011.dbo.L32 AS t
    ON      t.Zaehl_Fahrt_Id = r.Zaehl_Fahrt_Id
    AND     t.Sequenz = r.Sequenz + 1
)
SELECT  Zaehl_Fahrt_Id,  PlanAbfahrtStart,  Fahrzeit, Sequenz,  PlanAbfahrtStart,
CASE WHEN Stop_arrTime =  PlanAbfahrtStart THEN NULL ELSE Stop_arrTime END AS Stop_arrTime
FROM recCTE
ORDER BY  Zaehl_Fahrt_Id,  Sequenz

答案 1 :(得分:0)

我很确定这有效:

SELECT a.Vehicle_No, a.Stop1_DepTime, 
       a.Segment_TravelTime, a.Stop_Sequence, a.Stop1_DepTime +
  (SELECT SUM(b.Segment_TravelTime) FROM your_table b 
   WHERE b.Vehicle_No = a.Vehicle_No AND b.Stop_Sequence < a.Stop_Sequence)
FROM your_table a
ORDER BY a.Vehicle_No