Конвертировать строки в таблицу - PullRequest
0 голосов
/ 16 января 2012

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

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

Таблица настроек: первичный ключ = (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) со следующим выводом :

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, но я пытаюсь избежать этого. Надеюсь, вы можете помочь мне.

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

1 Ответ

2 голосов
/ 16 января 2012

Поскольку в вашей таблице результатов, по-видимому, есть только три dim-столбца, самым простым будет выражение case:

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

Отредактировано, чтобы добавить:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...