将列名和 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 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;
将列更改为行的过程称为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)
我有一个 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 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;
将列更改为行的过程称为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)