使用 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 函数取消透视表的主要内容,如果未能解决你的问题,请参考以下文章