使用 column_name 函数取消透视表

Posted

技术标签:

【中文标题】使用 column_name 函数取消透视表【英文标题】:unpivot a table using column_name function 【发布时间】:2014-07-30 08:57:49 【问题描述】:

我有一个表,它被设计为具有与我需要引用它的值相同的列。我知道如果我手动键入所有列名,我需要取消透视表并让它工作,但是这个表不断添加新列,所以我想捕获 unpivot 中的所有列,而不是手动编写脚本。

我可以使用 column_name 函数获取列名,并且想知道是否可以将其添加到 unpivot 中,我一直在玩它,目前对我来说它看起来不可能,所以我想 id 检查是否还有其他建议。

遗憾的是,我无法重新设计表格,并在其中不断添加列名,尽管这将是理想的解决方案。

select Day, Rota, RotaTemplate
from table1 t1
unpivot
(
  Rota
  for RotaTemplate in (select Column_name
                        from INFORMATION_SCHEMA.COLUMNS
                        where TABLE_NAME = 'table1')
) unpiv;

【问题讨论】:

【参考方案1】:

您不能这样做。您需要构建动态 SQL 语句,如下所示:

DECLARE @DynamicSQL NVARCHAR(MAX)

SET @DynamicSQL = N'select Day, Rota, RotaTemplate' + CHAR(10) + 
                 'from table1 t1'+ CHAR(10) + 
                 'unpivot' + CHAR(10) + 
                 '(' + CHAR(10) + CHAR(9) + 
                    'Rota for RotaTemplate in (' 
                    +  
                     STUFF
                    (
                        (
                            SELECT ',[' + [COLUMN_NAME] + '] '
                            FROM [INFORMATION_SCHEMA].[COLUMNS]
                            WHERE [TABLE_NAME] = 'table1'
                            FOR XML PATH('')
                        )
                        ,1
                        ,1
                        ,''
                    )
                    +')'  + CHAR(10) +
                 ') unpiv;'

EXEC sp_executesql @DynamicSQL

【讨论】:

感谢您的回复,我尝试了您的代码,但在 Day 列上出现错误“Day”列的类型与 UNPIVOT 列表中指定的其他列的类型冲突 实际上我发现错误是由于我拉出的日期列是表中的一列,所以我刚刚在 where 子句中将其过滤掉,感谢您的帮助

以上是关于使用 column_name 函数取消透视表的主要内容,如果未能解决你的问题,请参考以下文章

怎么全部取消excel2003数据透视表中的分类汇总

快速取消数据透视表的分类汇总行和总计行

取消透视 Excel 矩阵/数据透视表?

在 Mac 上的 Excel 2011 中取消透视表

如何取消透视表之类的交叉表?

Excel 请问资料透视表如何去掉汇总行