2011-05-04 102 views
2

我有以下問題。我有兩個表(從另一個開發另一臺服務器上創建): 巴士線路: LineID INT, DepartureTime日期時間, ...在SQL Server存儲過程中循環記錄?

BUSStops: LineID INT, StopID INT, 小時INT, 分鐘INT , ...

所以,我需要在格式上獲取數據: LineID INT, StopID INT, StopDeparture日期時間, ...

StopDeparture必須以每小時和分鐘添加到該行的上一個停止離開的方式計算每個StopID。

我的想法是選擇一個臨時表中的所有數據,並通過數據循環來重新計算出發時間。任何想法如何解決這個問題?

+1

哪個版本的SQL Server?如果> = 2005,那麼遞歸CTE將是有用的,而不使用臨時表&循環。更快啓動。抱歉,我沒有訪問SQL Server的代碼。順便說一句,包括創建表格和插入測試數據給寫答案的人會很好。 – 2011-05-04 20:26:33

+0

平均每條線有多少站? – 2011-05-04 20:32:46

回答

0

您可以使用光標。這裏是快速示例example。但是要警告遊標很慢,在很多情況下我不推薦它們。

2

只要每行的停止次數預計不會很大,可以使用三角形連接。

WITH BUSLines(LineID, DepartureTime) AS 
(
SELECT 1, CAST('1900-01-01T10:00:00' AS DATETIME) UNION ALL 
SELECT 2, CAST('1900-01-01T12:30:00' AS DATETIME) 
), 
BUSStops(LineID,StopID,Hour,Minute) AS 
(
SELECT 1,1,0,40 UNION ALL 
SELECT 1,2,0,10 UNION ALL 
SELECT 2,1,0,30 UNION ALL 
SELECT 2,2,0,27 UNION ALL 
SELECT 2,3,1,15 
) 
SELECT BL.LineID, 
     BS1.StopID, 
     DATEADD(MINUTE,SUM(BS2.Minute),DATEADD(HOUR,SUM(BS2.Hour),BL.DepartureTime)) 
FROM BUSLines BL 
JOIN BUSStops BS1 ON BL.LineID = BS1.LineID 
JOIN BUSStops BS2 ON BL.LineID = BS2.LineID AND BS2.StopID <= BS1.StopID 
GROUP BY BL.LineID, BL.DepartureTime, BS1.StopID