我有一个表,用代理名称作为列名来存储结果。每行都是一个入藏号的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
答案 0 :(得分:1)
我喜欢使用outer apply
和values
:
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)