我有一个包含 30 列的表格,我想轻松地取消旋转所有列。我知道我可以使用这个策略:
SELECT col, value
INTO New_Table
FROM
(SELECT * FROM Test_Data) p
UNPIVOT
(value FOR col IN (Column_Name1, Column_Name2... Column_Name30)) as unpvt
我的数据是这样输入的:
Column_Name1 Column_Name2 Column_Name3
Value11 Value21 Value31
Value12 Value22 Value32
Value13 Value23 Value33
这就是我想将它存储在新表中的方式:
New_Column1 New_cloumn2
Column_Name1 Value11
Column_Name1 Value12
Column_Name1 Value13
Column_Name2 Value21
...
但是必须有比输入 30 个列名称更简单的方法。
提前致谢。
最佳答案
这似乎是一个损坏的数据模型,但您可以避免输入列列表。
您可以使用它来生成列列表:
SELECT name
FROM sys.columns
WHERE objecT_id = OBJECT_ID('Test_Data')
和:
DECLARE @List VARCHAR(MAX) = STUFF((SELECT DISTINCT ',' + QUOTENAME(name)
FROM sys.columns
WHERE objecT_id = OBJECT_ID('Test_Data')
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)')
,1,1,'')
PRINT @List
然后您可以在动态 sql 语句中使用该列表:
DECLARE @List VARCHAR(MAX) = STUFF((SELECT DISTINCT ',' + QUOTENAME(name)
FROM sys.columns
WHERE objecT_id = OBJECT_ID('Test_Data')
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)')
,1,1,'')
,@sql VARCHAR(MAX)
SET @sql = 'SELECT col,value
INTO New_Table
FROM (SELECT * FROM Test_Data) p
UNPIVOT (value FOR col IN ('+@List+')) as unpvt
'
EXEC (@sql)
我建议使用
PRINT (@sql)
使用前 EXEC
以确保动态查询是您所追求的。
关于sql - 反转 SQL 表中的所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21996988/