2011-04-08 111 views
1

我正在爲類似於下面的總線路由系統的運輸類型的路由系統工作。 我有一個看法,它給了我這樣的輸出。我需要在計劃數量可變的時間表上進行調整。問題與查詢

我的查詢應該會導致圖像中下面給出的輸出。我嘗試使用Case語句,但是我返回的行數有問題。 !

http://i.stack.imgur.com/kumTw.jpg [在這裏輸入的形象描述] [1]

下面是生成表的腳本和參考的數據:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ScheduleTest]') AND type in (N'U')) 
BEGIN 
CREATE TABLE [dbo].[ScheduleTest](
[StationName] [nvarchar](255) NULL, 
[ScheduleNumber] [nvarchar](255) NULL, 
[ArrivalTime] [nvarchar](20) NULL, 
[DepartureTime] [nvarchar](20) NULL 
) ON [PRIMARY] 
END 
GO 



--Insert Scripts For Schedule A 
Insert into ScheduleTest Values ('Chicago, IL, (Union Station)', 'ScheduleA', NULL, '02:45') 
Insert into ScheduleTest Values ('Chicago, IL, (DownTown)', 'ScheduleA', '02:55', '03:00') 
Insert into ScheduleTest Values ('Benton, MI, Harbor', 'ScheduleA', '08:00', NULL) --Benton in this case 
--is final destination so departure time is null 

-- Insert Scripts for Schedule B (Another Which runs in the morning) 
Insert into ScheduleTest Values ('Chicago, IL, (Union Station)', 'ScheduleB', NULL, '06:00') 
Insert into ScheduleTest Values ('Chicago, IL, (DownTown)', 'ScheduleB', '06:10', '06:15') 
Insert into ScheduleTest Values ('Benton, IL, Harbor', 'ScheduleB', '11:00', NULL) 

我不認爲我能在Sql server 2005中使用pivoting,因爲它需要某種聚合來處理。我沒有聚集在這裏。

+0

您應該考慮更具體的標題。 – 2011-04-12 23:33:58

回答

0

我從不同的來源得到它...這工作,並感謝一個誰提出這個答案

IF OBJECT_ID( '的tempdb ..#ScheduleTest')IS NOT NULL DROP TABLE #ScheduleTest GO

IF OBJECT_ID(「的tempdb ..#tmp')IS NOT NULL DROP TABLE #tmp GO

CREATE TABLE #ScheduleTest( [工作站名稱] nvarchar的NULL, [ScheduleNumber] nvarchar的NULL, [ArrivalTime] nvarchar的NULL, [DepartureTime] nvarchar的NULL )ON [PRIMARY]

GO

--insert腳本對於方案A 插入#ScheduleTest值( '芝加哥,IL,(聯合車站)', 'ScheduleA',NULL,'02:45 ') 插入(''Chicago,IL,(DownTown)','ScheduleA','02:55','03:00')插入#ScheduleTest值('Benton,IL,Harbor','ScheduleA', '08:00' ,NULL)--Benton在這種情況下 --is最終目的地,出發時間爲null

- 插入腳本附表B(另一個其中在早晨運行) INSERT INTO #ScheduleTest值('Chicago,IL,(Union Station)','ScheduleB',NULL,'06:00') 插入#ScheduleTest值('芝加哥,伊利諾斯州(DownTown)','ScheduleB','06:10' ,'06:15') 插入#ScheduleTest值('Benton,IL,Harbor','ScheduleB','11:00',NULL)

SELECT 工作站名稱,ScheduleNumber,ArrivalTime AS TimeOfEvent, '到達' AS [到達/離開] INTO #tmp FROM #ScheduleTest WHERE ArrivalTime IS NOT NULL UNION ALL SELECT 工作站名稱,ScheduleNumber,DepartureTime AS TimeOfEvent,「出發'AS [到達/離開] FROM #ScheduleTest WHERE DepartureTime IS NOT NULL

- 由於樞軸的聚集要求,只有一個明細表/站組合是允許的。 - 這是對核心數據的查詢。現在,爲了動態此: SELECT 工作站名稱, ScheduleA, ScheduleB, [到達/離開] FROM #tmp AS噸 PIVOT (MAX(TimeOfEvent)FOR ScheduleNumber IN(ScheduleA,ScheduleB) )AS PVT

DECLARE @sql NVARCHAR(MAX), @ScheduleNumber VARCHAR(50), @PivotInList NVARCHAR(MAX)

SET @sql = 'SELECT工作站名稱,' SET @PivotInLis噸= 'IN('

DECLARE ScheduleCursor CURSOR FAST_FORWARD FOR SELECT DISTINCT ScheduleNumber FROM #tmp

OPEN ScheduleCursor FETCH NEXT FROM ScheduleCursor INTO @ScheduleNumber

WHILE @@ FETCH_STATUS = 0 BEGIN SET @sql = @sql + @ScheduleNumber + ' ' SET @PivotInList = @PivotInList +' '+ @ScheduleNumber +','

FETCH NEXT FROM ScheduleCursor INTO @ScheduleNumber 

END

CLOSE ScheduleCursor DEALLOCATE ScheduleCursor

SET @PivotInList = LEFT(@PivotInList,LEN(@PivotInList) - 1/刪除多餘的逗號空間 /)+ ')' PRINT @ PivotInList

SET @sql = @sql + '[到達/離開] FROM #tmp AS噸PIVOT(FOR MAX(TimeOfEvent)ScheduleNumber' + @PivotInList + ')AS PVT' PRINT @sql

EXEC sp_executeSQL @sql


0

我不知道這是非常有效的,但你可以試一試:

;WITH CTE AS 
(
    SELECT StationName, ScheduleNumber, ArrivalTime ScheduleTime, 'Arrival' [Arrival/Departure] 
    FROM ScheduleTest 
    WHERE ArrivalTime IS NOT NULL 
    UNION ALL 
    SELECT StationName, ScheduleNumber, DepartureTime, 'Departure' 
    FROM ScheduleTest 
    WHERE DepartureTime IS NOT NULL 
) 

SELECT StationName, 
     MIN(CASE WHEN ScheduleNumber = 'ScheduleA' THEN ScheduleTime ELSE NULL END) ScheduleA, 
     MIN(CASE WHEN ScheduleNumber = 'ScheduleB' THEN ScheduleTime ELSE NULL END) ScheduleB, 
     [Arrival/Departure] 
FROM CTE 
GROUP BY StationName, [Arrival/Departure] 
+0

嗯...值得一試..我可以檢查一下,看看我是否可以讓我的日程安排變得動態。正如我之前所說,時間表的數量會有所不同,不會固定爲一兩個,它可以是每天2-40次 – 2011-04-08 18:54:07