如何使用动态数据透视来生成时间表

时间:2017-11-29 08:05:23

标签: sql-server tsql pivot dynamic-sql

我想生成一个时间表,我有这些列:

Time      Itinerary      ID  
06:35       3579        87069                                                                                                                                                                                                                                                  
07:15       3031        63722                                                                                                                                                                                                                                                 
07:15       3031        68218                                                                                                                                                                                                                                                 
16:30       3031        82745                                                                                                                                                                                                                                                 
16:30       3031        88308                                                                                                                                                                                                                                                 
21:00       3031        72212                                                                                                                                                                                                                                                 
21:00       3031        76241                                                                                                                                                                                                                                                 
06:55       3576        87069                                                                                                                                                                                                                                                            
07:25       3333        63722                                                                                                                                                                                                                                                            
07:25       3333        68218                                                                                                                                                                                                                                                            
16:40       3333        82745    

我希望得到这个:

            3579   3031   3576  3333
87069       06:35         06:55
63722              07:15
68218              07:15
  .
  .
  .

行程数是可变的,我可以从一个表中获取此信息。

1 个答案:

答案 0 :(得分:0)

动态PIVOT的完整工作示例:

CREATE TABLE #DataSource
(
    [Time] TIME
   ,[Itinerary] INT
   ,[ID] INT
);

INSERT INTO #DataSource ([Time], [Itinerary], [ID])
VALUES ('06:35', '3579', '87069')
      ,('07:15', '3031', '63722')
      ,('07:15', '3031', '68218')
      ,('16:30', '3031', '82745')
      ,('16:30', '3031', '88308')
      ,('21:00', '3031', '72212')
      ,('21:00', '3031', '76241')
      ,('06:55', '3576', '87069')
      ,('07:25', '3333', '63722')
      ,('07:25', '3333', '68218')
      ,('16:40', '3333', '82745');

DECLARE @DynammicTSQLStatement NVARCHAR(MAX)
       ,@DynamicPIVOTColumns NVARCHAR(MAX);


SET @DynamicPIVOTColumns = STUFF
                          (
                                (
                                SELECT ',[' + CAST([Itinerary] AS VARCHAR(12)) + ']'
                                FROM #DataSource
                                GROUP BY [Itinerary]
                                ORDER BY [Itinerary]
                                FOR XML PATH('') ,TYPE
                                ).value('.', 'NVARCHAR(MAX)')
                                ,1
                                ,1
                                ,''
                          );

SET @DynammicTSQLStatement = N'
SELECT *
FROM #DataSource
PIVOT
(
    MAX([Time]) FOR [Itinerary] IN (' + @DynamicPIVOTColumns + ')
) PVT';

EXEC sp_executesql @DynammicTSQLStatement;

DROP TABLE #DataSource;

enter image description here