2017-01-30 13 views
0

代謝物名を列名として格納したテーブルがあります。各行はアクセス番号で識別されます。ピボット列名と指定した1行の値を2列に変換

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

2つの列を持つ一時グローバルテーブルを作成したいとします。最初の列は代謝産物の名前を持ち、2番目の列は指定されたaccession_numberのすべての値を持ちます。テーブルの名前は、アクセッション番号及び結果(## 000001Results)だろう

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

答えて

2

行に列を変更するプロセスが呼び出されます開封。あなたは2つだけの列(代謝物名と質問で述べたように、結果を)必要がある場合は

、あなたは単に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) 
+0

'^ '1'あなたはここに私を助けることができるhttp://stackoverflow.com/questions/41932151/how-to-get-ids-of-4-distinct-values-combination-of-2-keys – user3637224

+0

ありがとうございます。クエリに各代謝物を追加する代わりに列名を動的に追加する方法はありますか?私はストアドプロシージャでこれを使用したいと思います。結果テーブルに代謝物を追加すると、新しい代謝物を取得するクエリが必要になります。 – JohnnyBaltimore

+0

@Johnny私はこの目的のためにダイナミックSQLを使うことができると思います。 googleでそれを見てみると、これに関する豊富なリソースが見つかります – GurV

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; 
関連する問題