如何将行转换为具有dynamic值的SQL或SSIS中的列

我有以下表格每日数据保存:

由SQL Query生成的数据

我需要读取最近7天的数据,并将行转置为列以将其保存在Excel报表中。 我试图用SSIS自动化这个。 请注意,这里的转置后行为的date将基于过去七天的dynamic,所以我不能在透视函数中使用静态列名称。 所需的输出将如下所示:

所需的输出格式

请build议如何通过MS-SQL或SSIS完成输出。 提前致谢。 以下是表架构和示例数据:

IF OBJECT_ID('tempdb..#PriorityTrends') IS NOT NULL DROP TABLE #PriorityTrends CREATE TABLE #PriorityTrends ( CountDate DATETIME, [Priority 1] INT, [Priority 2] INT, [Priority 3] INT, [Priority 4] INT, [Priority 5] INT, Total INT ) INSERT INTO #PriorityTrends VALUES ('6/24/2014', 163, 235, 741, 265, 1932, 1404) INSERT INTO #PriorityTrends VALUES ('6/25/2014', 174, 368, 775, 256, 2634, 1573) INSERT INTO #PriorityTrends VALUES ('6/26/2014', 201, 448, 703, 270, 2717, 1622) INSERT INTO #PriorityTrends VALUES ('6/27/2014', 140, 464, 612, 257, 1776, 1473) INSERT INTO #PriorityTrends VALUES ('6/30/2014', 106, 333, 1274, 311, 1480, 2024) INSERT INTO #PriorityTrends VALUES ('7/1/2014', 164, 834, 1533, 1145, 10483, 3676) INSERT INTO #PriorityTrends VALUES ('7/2/2014', 136, 378, 1421, 391, 9018, 2326) 

我可以用dynamicSQL和pivoting来实现,但是它很长,但是它足以满足我的要求。 如果有人可以给出build议,优化这个,它将是欢迎。 这篇文章帮助了我。

以下是对我有效的查询:

  IF OBJECT_ID('tempdb..#PriorityData') IS NOT NULL DROP TABLE #PriorityData create table #PriorityData( CountDate date, [Priority 1] int, [Priority 2] int, [Priority 3] int, [Priority 4] int, [Priority 5] int, Totals int ) insert into #PriorityData select * from (select top 7 * from PriorityTrends p order by p.CountDate desc) as temp order by temp.CountDate select * from #PriorityData DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX) SET @columns = N'' SELECT @columns += N', ' + QUOTENAME(CountDate) FROM (SELECT p.CountDate FROM #PriorityData AS p) AS x SET @sql = N' SELECT ''Priority 1'' AS Priority, ' + STUFF(@columns, 1, 2, '') + ' FROM ( SELECT CountDate, [Priority 1] from #PriorityData ) AS j PIVOT ( SUM([Priority 1]) FOR CountDate IN (' + STUFF(REPLACE(@columns, ', p1.[', ',['), 1, 1, '') + ') ) AS p1 UNION ALL SELECT ''Priority 2'' AS Priority, ' + STUFF(@columns, 1, 2, '') + ' FROM ( SELECT CountDate, [Priority 2] from #PriorityData ) AS j PIVOT ( SUM([Priority 2]) FOR CountDate IN (' + STUFF(REPLACE(@columns, ', p2.[', ',['), 1, 1, '') + ') ) AS p2 UNION ALL SELECT ''Priority 3'' AS Priority, ' + STUFF(@columns, 1, 2, '') + ' FROM ( SELECT CountDate, [Priority 3] from #PriorityData ) AS j PIVOT ( SUM([Priority 3]) FOR CountDate IN (' + STUFF(REPLACE(@columns, ', p3.[', ',['), 1, 1, '') + ') ) AS p3 UNION ALL SELECT ''Priority 4'' AS Priority, ' + STUFF(@columns, 1, 2, '') + ' FROM ( SELECT CountDate, [Priority 4] from #PriorityData ) AS j PIVOT ( SUM([Priority 4]) FOR CountDate IN (' + STUFF(REPLACE(@columns, ', p4.[', ',['), 1, 1, '') + ') ) AS p4 UNION ALL SELECT ''Priority 5'' AS Priority, ' + STUFF(@columns, 1, 2, '') + ' FROM ( SELECT CountDate, [Priority 5] from #PriorityData ) AS j PIVOT ( SUM([Priority 5]) FOR CountDate IN (' + STUFF(REPLACE(@columns, ', p5.[', ',['), 1, 1, '') + ') ) AS p5 UNION ALL SELECT ''Totals'' AS Priority, ' + STUFF(@columns, 1, 2, '') + ' FROM ( SELECT CountDate, [Totals] from #PriorityData ) AS j PIVOT ( SUM([Totals]) FOR CountDate IN (' + STUFF(REPLACE(@columns, ', t.[', ',['), 1, 1, '') + ') ) AS t' PRINT @sql EXEC sp_executesql @sql