将列名和 1 个指定行的值转换为 2 列

Pivot Column names and 1 specified row's values into 2 columns

我有一个 table 存储以代谢物名称作为列名的结果。每行都由一个登录号标识。

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

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

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

我喜欢 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;

将列更改为行的过程称为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)