我有一个带有Tag列的表,其中包含大约1000个不同的标签。我想为每个不同的标签创建一个带有列的新表,该列名称将是标签值。使用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 ...
更新:
我知道限制(在表中的列数上),但是列不会稀疏,并且任何列中都不会有null或0值。
我想要此表的原因是我想针对此新表的列运行SSAS群集算法。
使用PIVOT表运算符,然后使用INTO子句从数据透视表的列中创建新表。像这样的东西:
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如下的全新表:
newtablename
| TAG1 | TAG2 | TAG3 | TAG4 | ----------------------------- | 123 | 854 | 923 | 44 |