sql - 如何使用列中的不同值作为新表的列名创建表?

标签 sql sql-server tsql pivot

我有一个带有大约 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 Fiddle Demo


  • 然而,在您的情况下,您必须使用动态 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);
    

    在这里查看它的实际效果:
  • SQL Fiddle Demo

  • 这将创建一个名为 newtablename 的全新表。看起来像:
    | TAG1 | TAG2 | TAG3 | TAG4 |
    -----------------------------
    |  123 |  854 |  923 |   44 |
    

    关于sql - 如何使用列中的不同值作为新表的列名创建表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589492/

    相关文章:

    sql - 如何在sql server中拆分和连接?

    database - 如何选择背靠背的条目?

    mysql - 如何在mysql中的同一个表上执行内连接

    sql - 根据另一列的值在一列上添加多个 CHECK 约束

    mysql - 具有多个一对多的 3 个表的 SQL JOIN

    sql - SSRS 2008 - Reporting Services 网页除标题外均为空白

    java - 我应该在 JOOQ 上禁用 UInteger 类型吗?

    SQL 错误的百分比计算

    c# - GridView 编辑

    sql - 合并到广告订单中