2017-01-30 11 views
0

У меня есть таблица, в которой хранятся результаты с именами метаболитов в качестве имен столбцов. Каждая строка имеет идентификационный номер.Имена столбцов Pivot и 1 заданные значения строки в 2 столбца

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

Я хотел бы создать временную глобальную таблицу с двумя столбцами. Первый столбец будет иметь названия метаболитов, а второй будет иметь все значения для определенного номера доступа. Имя таблицы будет число присоединение и результаты (##) 000001Results

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

ответ

2

Процесс изменения столбцов в строки называется UNPIVOTING.

Если вам нужно только два столбца (имя метаболита и результат, как указано в вопросе), вы можете просто использовать UNPIVOT:

select Metabolite, Results 
from your_table t 
unpivot (
    Results for 
     Metabolite in (
      Metabolite1, 
      . . . 
      Metabolite77 
     ) 
) as x; 

Если вы хотите, чтобы получить идентификаторы тоже, а затем использовать 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 Я думаю, вы можете использовать Dynamic SQL для этой цели. Просто найдите его в Google, и вы найдете много ресурсов на этом – GurV

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;