【问题标题】:How to export dynamic SQL Server pivot table to excel如何将动态 SQL Server 数据透视表导出到 Excel
【发布时间】:2015-04-22 08:58:19
【问题描述】:

我正在开发一个显示来自 Microsoft SQL Server 动态数据透视表的数据的 web 应用程序。

通常我会尝试找出一种在 c# 中进行动态数据透视的方法,但在这种情况下,数据透视必须是 SQL Server 存储过程,因为其他应用程序也需要访问数据透视表。

这是 SQL:

DECLARE @DynamicPivot AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

SELECT 
    @ColumnName = ISNULL(@ColumnName + ',', '') 
                  + QUOTENAME(xml_tag_name)
FROM 
    (SELECT DISTINCT xml_tag_name FROM DataEntries) AS TagValues

SET @DynamicPivot =
N'SELECT DISTINCT capture_id, ' + @ColumnName + '
FROM DataEntries
PIVOT(MAX(xml_tag_value) 
FOR xml_tag_name IN (' + @ColumnName + ')) AS PVTTable'

EXEC sp_executesql @DynamicPivot

我读过的所有文章都涉及正常导出到 Excel 或静态数据透视表。例如:Export Table from SQL Server to Excel 2007 using C#

如何将此动态数据透视表导出到 Excel?

【问题讨论】:

  • 你能做的第一步是什么?
  • 你问我能不能正常导出?是的,我可以。
  • 基本上,您是在尝试模拟 Excel 数据透视表的功能。为什么不使用 Excel 的数据透视表呢?它针对此类工作进行了优化,没有什么比动态更改列的能力更动态的了。
  • 其他应用也需要访问数据库中的数据透视表。目前,这个特定的应用程序是唯一需要导出的应用程序。
  • 我构建了一个单独的 C# 控制台应用程序,它通过 args 数组传递了一个查询和一个文件路径,然后将透视数据拉到 C# 中的数据表中,并使用 EPPlus 扩展库将数据表写入新的excel文件。然后我在 SQL Server 中使用 xp_cmdshell 调用了这个控制台应用程序,它很有效,而且很容易实现。

标签: c# sql-server export-to-excel dynamic-pivot


【解决方案1】:

这里有一个例子。

它创建到全局临时表的动态数据透视表,然后将其导出到 Excel。 如果您发现导出部分有问题 - 请告诉我。

CREATE TABLE Table1 (ColId INT,ColName VARCHAR(10))
INSERT INTO Table1 VALUES(1, 'Country')
INSERT INTO Table1 VALUES(2, 'Month')
INSERT INTO Table1 VALUES(3, 'Day')

CREATE TABLE Table2 (tID INT,ColID INT,Txt VARCHAR(10))

INSERT INTO Table2 VALUES (1,1, 'US')
INSERT INTO Table2 VALUES (1,2, 'July')
INSERT INTO Table2 VALUES (1,3, '4')
INSERT INTO Table2 VALUES (2,1, 'US')
INSERT INTO Table2 VALUES (2,2, 'Sep')
INSERT INTO Table2 VALUES (2,3, '11')
INSERT INTO Table2 VALUES (3,1, 'US')
INSERT INTO Table2 VALUES (3,2, 'Dec')
INSERT INTO Table2 VALUES (3,3, '25')


DECLARE @cols NVARCHAR(2000);
SELECT  @cols = COALESCE(@cols + ',[' + colName + ']', '[' + colName + ']')
FROM    Table1
ORDER BY colName;
IF OBJECT_ID('tempdb..##t1') IS NOT NULL
    BEGIN
        DROP TABLE ##t1;
    END;

DECLARE @query NVARCHAR(4000);
SET @query = N'SELECT tID, ' + @cols + ' into ##t1
FROM
(SELECT  t2.tID
      , t1.ColName
      , t2.Txt
FROM    Table1 AS t1
        JOIN Table2 AS t2 ON t1.ColId = t2.ColID) p
PIVOT
(
MAX([Txt])
FOR ColName IN
( ' + @cols + ' )
) AS pvt
ORDER BY tID;';


EXECUTE(@query);

SELECT  *
FROM    ##t1;


DECLARE @sql VARCHAR(MAX);
DECLARE @FileName VARCHAR(MAX) = 'C:\Test.xls';
SET @sql = 'INSERT INTO OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',''Excel 12.0;Database='
    + @FileName + ''',''SELECT * FROM [Sheet1$]'') SELECT * FROM ##T1';
EXECUTE(@sql);

【讨论】:

  • 我的动态轴可以有无限数量的列。 DataEntries 枢轴成为数据透视表的标题/列名。因此,当客户端在DataEntries 中捕获更多信息时,列的数量会发生变化。这是一个很好的答案,但问题是它仍然依赖于固定数量的列。
猜你喜欢
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 2014-10-16
  • 2014-07-26
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多