一尘不染

如何使用来自列的不同值作为新表的列名来创建表?

sql

我有一个带有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群集算法。


阅读 166

收藏
2021-03-08

共1个答案

一尘不染

使用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 |
2021-03-08