【问题标题】:How to transpose rows to columns in SQL or SSIS having dynamic values如何将行转置为 SQL 或 SSIS 中具有动态值的列
【发布时间】:2014-07-04 19:36:47
【问题描述】:

我有下表保存每日数据:

我需要读取最近 7 天的数据并将行转换为列以将其保存在 Excel 报表中。我正在尝试使用 SSIS 自动执行此操作。 请注意,此处将在转置后作为列运行的日期将基于过去 7 天是动态的,因此我不能在数据透视函数中使用静态列名。 所需的输出将如下所示:

请建议我如何通过 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)

【问题讨论】:

  • 可以用SQL server自己完成。为此,您不需要 SSIS 的强大功能。请以文本形式而不是图像形式输入您的原始表格,我可以提供帮助。您需要使用 2 件事 - 旋转和动态 sql 来实现结果。
  • 你不能从管理工作室复制粘贴结果集并在这里发布吗?
  • 我就是这么做的。但它以这种奇怪的格式显示。对不起,但我不知道如何才能更优雅地表达。
  • 你能给我创建表和示例行的sql吗?我不会输入所有这些。
  • 在问题中查看我的更新。我在那里提供了样品。谢谢。

标签: sql sql-server excel ssis transpose


【解决方案1】:

我能够使用动态 SQL 和旋转来完成它,但是它很长,但足以满足我的要求。如果有人可以提出建议来优化它,那将是受欢迎的。 This article helped me.

以下是对我有用的查询:

    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

【讨论】:

    猜你喜欢
    • 2013-12-21
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2016-04-20
    • 2021-12-16
    • 2022-01-17
    • 2017-05-24
    • 1970-01-01
    相关资源
    最近更新 更多