【问题标题】:SQL Server 2005 query pivot over variable number of schedulesSQL Server 2005 查询透视可变数量的计划
【发布时间】:2011-08-01 16:21:01
【问题描述】:

我正在开发一种类似于以下公交路线系统的运输类型的路线系统。 我有一个观点,可以给我输出。我需要在时间表数量可以是可变数量的时间表上进行调整。

我的查询应该会产生如下图所示的输出。我尝试使用 Case Statements,但返回的行数有问题。

以下是生成表格和数据以供参考的脚本:

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 中使用旋转,因为它需要某种聚合才能工作。我这里没有汇总。

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    我不确定这是否非常有效,但你可以尝试一下:

    ;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]
    

    【讨论】:

    • 嗯...值得一试..我可以检查一下这个,看看我是否可以让我的日程安排动态化。正如我之前所说,日程安排的数量会有所不同,不会固定为一两个,它可以是一天 2-40 个
    【解决方案2】:

    我从不同的来源得到它...这很有效,感谢提出这个答案的人

    IF OBJECT_ID('tempdb..#ScheduleTest') 不为空 删除表#ScheduleTest 去吧

    IF OBJECT_ID('tempdb..#tmp') 不为空 删除表#tmp 去吧

    创建表#ScheduleTest( [站名] nvarchar NULL, [ScheduleNumber] nvarchar NULL, [到达时间] nvarchar NULL, [出发时间] nvarchar NULL ) 在 [主要] 上

    --为 Schedule A 插入脚本 插入#ScheduleTest 值('Chicago,IL,(Union Station)','ScheduleA',NULL,'02:45') 插入#ScheduleTest 值('Chicago,IL,(DownTown)','ScheduleA','02:55','03:00') 插入#ScheduleTest 值('Benton, IL, Harbor', 'ScheduleA', '08:00', NULL)--本例中的 Benton -- 是最终目的地,所以出发时间为空

    -- 为 Schedule B 插入脚本(另一个在早上运行) 插入#ScheduleTest 值('Chicago,IL,(Union Station)','ScheduleB',NULL,'06:00') 插入#ScheduleTest 值('Chicago,IL,(DownTown)','ScheduleB','06:10','06:15') 插入#ScheduleTest 值('Benton,IL,Harbor','ScheduleB','11:00',NULL)

    选择 StationName, ScheduleNumber, ArrivalTime AS TimeOfEvent, 'Arrival' AS [Arrival/Departure] 进入#tmp 从 #ScheduleTest 在哪里 到达时间不为空 联合所有 选择 StationName, ScheduleNumber, DepartureTime AS TimeOfEvent, 'Departure' AS [Arrival/Departure] 从 #ScheduleTest 在哪里 出发时间不为空

    -- 由于pivot的聚合要求,只允许一个Schedule/Station组合。 -- 这是对核心数据的查询。现在,动态这个: 选择 站名, 安排一个, 附表B, [到达/离开] 从 #tmp 作为 t 枢 ( MAX(TimeOfEvent) FOR ScheduleNumber IN ( ScheduleA, ScheduleB) ) 作为列兵

    声明@sql nVARCHAR(MAX), @ScheduleNumber VARCHAR(50), @PivotInList nVARCHAR(MAX)

    SET @sql = '选择站名,' SET @PivotInList = ' IN ('

    DECLARE ScheduleCursor CURSOR FAST_FORWARD FOR SELECT DISTINCT ScheduleNumber FROM #tmp

    打开 ScheduleCursor 从 ScheduleCursor 获取下一个到 @ScheduleNumber

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

        FETCH NEXT FROM ScheduleCursor INTO @ScheduleNumber
    

    结束

    关闭 ScheduleCursor DEALLOCATE ScheduleCursor

    SET @PivotInList = LEFT( @PivotInList, LEN( @PivotInList) - 1 /去掉多余的逗号/) + ')' 打印@PivotInList

    SET @sql = @sql + '[Arrival/Departure] FROM #tmp AS t PIVOT (MAX(TimeOfEvent) FOR ScheduleNumber' + @PivotInList + ') AS pvt' 打印@sql

    执行 sp_executeSQL @sql


    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多