我有一个带有大约 1000 个不同标签的 Tag 列的表。我想为每个不同的标签创建一个包含一列的新表,列名将是标签值。是否有使用 T-SQL 做到这一点的好方法? SQL Server 2005 及更高版本中的任何内容都可以。
这是我的意思的一个例子:
Table:
Tag Value Timestamp
tag1 123 ---
tag1 456 ---
tag2 854 ---
tag3 923 ---
.
.
.
tag90 324 ---
New Table:
tag1 tag2 tag3 ... tag90
123 854 923 324
456 ...
更新:
我知道限制(表中的列数),但是列不会稀疏,并且任何列中都不会有空值或 0 值。
我想要这个表的原因是我想针对这个新表的列运行 SSAS 聚类算法。
最佳答案
使用 PIVOT
表运算符,然后使用 INTO
子句从透视列创建一个新表。像这样的东西:
SELECT *
INTO newtablename
FROM ( SELECT tag, value FROM tags) AS t
PIVOT
(
MIN(value)
FOR tag in ([tag1], [tag2], [tag3], [tag4])
) AS p;
在这里查看它的实际效果:
然而,在您的情况下,您必须使用动态 sql 为表中的任意数量的标签动态执行此操作,而不是手动列出它们。像这样:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' +
QUOTENAME(tag)
FROM tags
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '');
SELECT @query = 'SELECT *
INTO newtablename
FROM ( SELECT tag, value FROM tags) AS t
PIVOT
(
MIN(value)
FOR tag in ( ' + @cols + ' )
) AS p';
execute(@query);
在这里查看它的实际效果:
这将创建一个名为
newtablename
的全新表。看起来像:| TAG1 | TAG2 | TAG3 | TAG4 |
-----------------------------
| 123 | 854 | 923 | 44 |
关于sql - 如何使用列中的不同值作为新表的列名创建表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589492/