2012-01-16 2 views
0

Мне нужно создать таблицу (возможно, представление), которая связывает две таблицы, одну таблицу конфигураций с таблицей результатов. Проблема в том, что необходимо преобразовать простую строку в таблицу результатов в несколько строк таблицы configs.Преобразование строк в таблицу

Я дам вам пример того, что мне нужно:

Configs Таблица: первичный ключ = (id_file, cpattr)

id_file  cpattr  type 
------------------------------------ 
f01   dim01  merchant_id 
f01   dim02  card_number 
f01   dim03  trans_code 
f02   dim01  card_number 
f02   dim02  amount 

Таблица результатов

id_file dim01 dim02 dim03 
------------------------------------------------------- 
f01  01  88  015 
f02  99  0.78 null 

И я хочу получить таблицу (View) со следующим output:

id_file type   data 
-------------------------------------------------- 
f01  merchant_id  01 
f01  card_number  88 
f01  trans_code  015 
f02  card_numer  99 
f02  amount   0.78 

Я не вижу способ сделать это без использования динамического SQL, но я стараюсь, чтобы избежать этого. Надеюсь, ты поможешь мне.

Заранее спасибо.

ответ

2

Поскольку появляется у вас есть только три тусклых столбцы в таблице результатов, проще всего было бы сазе:

select 
    c.id_file 
    , [type] 
    , case c.cpattr 
     when 'dim01' then r.dim01 
     when 'dim02' then r.dim02 
     when 'dim03' then r.dim03 
     else '' 
    end [data] 
from 
    configs c 
    left join results r 
     on c.id_file = r.id_file 

Edited добавить:

Поскольку есть неопределенная количество тусклых столбцов, может быть несколько лучше подходит:

select 
    c.id_file, c.type, o.data 
from 
    _configs c 
    left join 
    (
     select * from _results 
     unpivot 
     (
      [data] for cpattr in (dim01, dim02, dim03, ...) 
     ) as [output] 
    ) as [o] 
     on c.id_file = o.id_file 
     and c.cpattr = o.cpattr 

Вы по-прежнему должны идентифицировать все тусклые столбцы затронуты, но вам нужно сделать это один раз, а не дважды. Это также вызовет ошибку, если какой-либо из тусклых столбцов будет удален или переименован, хотя он не будет заполняться из новых тусклых столбцов. Не уверен в этом.

+0

спасибо. Ваше решение решило мою проблему, несмотря на то, что у меня нет только 3 dim, но плюс 50, что, вероятно, делает код немного неэффективным. – Fabio

+0

добавлено редактирование с альтернативным подходом, вы можете принять –

+0

На данный момент у меня есть первое решение, работающее отлично, несмотря на то, что у меня нет большого количества данных. когда у меня есть реальные данные, я проверю оба решения, чтобы выбрать лучший. Благодаря! :) – Fabio

Смежные вопросы