【问题标题】:Pivot Column names and 1 specified row's values into 2 columns将列名和 1 个指定行的值转换为 2 列
【发布时间】:2017-01-30 03:04:17
【问题描述】:

我有一个表,它以代谢物名称作为列名存储结果。每行都由一个入藏号标识。

id    accession_number metabolite1 metabolite2 ... meatbolite77
1     000001            50          0                32
2     000002            0           38               0

我想创建一个包含两列的临时全局表。第一列将包含代谢物的名称,第二列将包含指定 accession_number 的所有值。表的名称将是入藏号和结果 (##000001Results)

id    Metabolite    Results
1     Metabolite1  50
2     Metabolite2  0
...
77    Metabolite77 32

【问题讨论】:

    标签: sql-server pivot


    【解决方案1】:

    将列变为行的过程称为UNPIVOTING

    如果您只需要两列(问题中提到的代谢物名称和结果),您可以简单地使用UNPIVOT

    select Metabolite, Results
    from your_table t
    unpivot (
        Results for 
            Metabolite in (
                Metabolite1,
                . . .
                Metabolite77
            )
    ) as x;
    

    如果您也想获取 ID,请使用 OUTER APPLY,如下所示:

    select x.*
    from t outer apply ( 
        values 
            (1, 'Metabolite1', metabolite1),
            ...
            (77, 'Metabolite77', metabolite77)
    ) x (id, Metabolite, Results)
    

    【讨论】:

    • 谢谢。有没有办法动态添加列名,而不必在查询中添加每个代谢物?我想在存储过程中使用它。如果我将代谢物添加到结果表中,我希望查询能够获取新的代谢物。
    • @Johnny 我认为您可以为此目的使用动态 SQL。只需在 google 上查找它,您就会找到大量关于此的资源
    【解决方案2】:

    我喜欢用outer applyvalues 来做这件事:

    select v.id, v.metabolite, v.results
    from t outer apply
         (values (1, 'metabolite1', metabolite1),
                 (2, 'metabolite2', metabolite2),
                 . . .
         ) v(id, metabolite, results)
    where t.accession_number = @accession_number;
    

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 2015-08-15
      • 2016-02-25
      • 2023-03-21
      相关资源
      最近更新 更多