Я получил его из другого источника ... Это работает, и спасибо тому, кто предложил этот ответ
ЕСЛИ 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