Проблема с запросом - PullRequest
       1

Проблема с запросом

0 голосов
/ 08 апреля 2011

Я работаю над системой маршрутизации для типа перевозки, аналогичного системе маршрутизации автобусов, как показано ниже. У меня есть представление, которое дает мне вывод, как это. Мне нужно поворачиваться по графикам, где количество графиков может быть переменного количества.

Мой запрос должен привести к выводу, приведенному ниже на изображении. Я пытался использовать Case Casements, но у меня были проблемы с количеством возвращаемых строк.

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)

Я не думаю, что смогу использовать pivoting в Sql server 2005, так как для работы требуются какие-то агрегаты. У меня нет ничего общего здесь.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Я получил его из другого источника ... Это работает, и спасибо тому, кто предложил этот ответ

ЕСЛИ OBJECT_ID ('tempdb .. # ScheduleTest') не равен NULL DROP TABLE #ScheduleTest GO

ЕСЛИ OBJECT_ID ('tempdb .. # tmp') не равен NULL DROP TABLE #tmp GO

CREATE TABLE #ScheduleTest ( [StationName] nvarchar NULL, [ScheduleNumber] nvarchar NULL, [ArrivalTime] nvarchar NULL, [DepartureTime] nvarchar NULL ) НА [ПЕРВИЧНО]

GO

- Вставить сценарии для расписания А Вставьте в значения #ScheduleTest («Чикаго, Иллинойс, (Юнион Стейшн)», «Расписание А», NULL, «02: 45») Вставьте в значения #ScheduleTest («Чикаго, Иллинойс, (DownTown)», «ScheduleA», «02: 55», «03: 00») Вставьте в значения #ScheduleTest ('Benton, IL, Harbour', 'ScheduleA', '08: 00 ', NULL) - в этом случае - Benton - конечный пункт назначения, поэтому время отправления равно нулю

- Вставить сценарии для расписания B (еще один, который запускается утром) Вставьте в значения #ScheduleTest («Чикаго, Иллинойс, (Union Station)», «Расписание B», NULL, «06: 00») Вставьте в значения #ScheduleTest («Чикаго, Иллинойс, (DownTown)», «Расписание B», «06: 10», «06: 15») Вставьте в значения #ScheduleTest («Benton, IL, Harbour», «ScheduleB», «11: 00», NULL)

ВЫБРАТЬ StationName, ScheduleNumber, ArrivalTime AS, TimeOfEvent, 'Arrival' AS [Прибытие / Отправление] INTO #tmp ОТ #ScheduleTest ГДЕ ArrivalTime НЕ НУЛЬ СОЮЗ ВСЕХ ВЫБРАТЬ StationName, ScheduleNumber, DepartureTime AS, TimeOfEvent, «Отправление» AS [Прибытие / Отправление] ОТ #ScheduleTest ГДЕ Время отправления не равно NULL

- Из-за требования агрегации сводной точки разрешена только одна комбинация Расписание / Станция. - это запрос основных данных. Теперь, чтобы динамически это: ВЫБРАТЬ Название станции, ScheduleA, ScheduleB, [Прибытие Отъезд] ОТ #tmp AS t PIVOT (MAX (TimeOfEvent) FOR ScheduleNumber IN (ScheduleA, ScheduleB) ) AS pvt

ОБЪЯВИТЬ @sql nVARCHAR (МАКС.), @ScheduleNumber VARCHAR (50), @PivotInList nVARCHAR (MAX)

SET @sql = 'ВЫБРАТЬ Имя станции' SET @PivotInList = 'IN ('

ОБЪЯВИТЬ ScheduleCursor CURSOR FAST_FORWARD FOR ВЫБЕРИТЕ DISTINCT ScheduleNumber FROM # tmp

OPEN ScheduleCursor ПОЛУЧИТЬ СЛЕДУЮЩУЮ ОТ ScheduleCursor INTO @ ScheduleNumber

WHILE @@ FETCH_STATUS = 0 НАЧАТЬ SET @sql = @sql + @ScheduleNumber + ',' SET @PivotInList = @PivotInList + '' + @ScheduleNumber + ','

    FETCH NEXT FROM ScheduleCursor INTO @ScheduleNumber

END

ЗАКРЫТЬ ScheduleCursor DEALLOCATE ScheduleCursor

SET @PivotInList = LEFT (@PivotInList, LEN (@PivotInList) - 1 / Удалить лишние запятые /) + ')' PRINT @ PivotInList

SET @sql = @sql + '[Прибытие / Отъезд] FROM #tmp AS t PIVOT (MAX (TimeOfEvent) FOR ScheduleNumber' + @PivotInList + ') AS pvt' PRINT @ sql

EXEC sp_executeSQL @ sql


0 голосов
/ 08 апреля 2011

Я не уверен, что это очень эффективно, но вы можете попробовать:

;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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...