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

时间:2017-01-30 03:04:17

标签: sql-server pivot

我有一个表,用代理名称作为列名来存储结果。每行都是一个入藏号的id。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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)