Сводные несколько рядов - PullRequest
1 голос
/ 24 марта 2012

У меня есть таблица, похожая на следующую:

id    key    str_val    date_val      num_val
1     A      a
1     B      b
1     C                 2012-01-01
1     D                               1
2     A      c
2     E      d
2     C                 2012-01-02
2     D                                2

Мне нужно, чтобы он выглядел как:

id    A      B      C             D       E
1     a      b      2012-01-01    1
2     c             2012-01-02    2       d

По сути, каждый ключ должен стать своим собственным столбцом

Я попытался и не смог использовать команду PIVOT с пользой, и в настоящее время я пытаюсь выполнить это с помощью оператора case. т.е.

select
    id,
    case key
        when 'A'
        then str_val
    end as A,
    case key
        when 'C'
        then date_val
    end as C
    --etc.
from test_table

Однако я не могу понять, как объединить строки таблицы после этого запуска. Я застрял с:

id    A      B      C             D       E
1     a
1            b
1                   2012-01-01
1                                 1

Какие-нибудь мысли или предложения могут мне помочь? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Вы находитесь на 90% пути:

with cte as (
    select 
        id, 
        case [key] 
            when 'A' 
            then str_val 
        end as A, 
        case [key] 
            when 'B' 
            then str_val 
        end as B, 
        case [key] 
            when 'C' 
            then date_val 
        end as C, 
        case [key] 
            when 'D' 
            then num_val 
        end as D,
        case [key] 
            when 'E' 
            then str_val 
        end as E 
    from test_table
)
select id, max(A) as A, max(B) as B, max(C) as C, max(D) as D, max(E) as E
from cte
group by id
2 голосов
/ 24 марта 2012

Поскольку идентификатор и ключ являются уникальной комбинацией для каждой таблицы, вы можете написать запрос следующим образом:

SELECT ta.str_val as A,
       tb.str_val as B,
       tc.date_val as C,
       td.num_val as D,
       te.str_val as E
FROM (SELECT DISTINCT id FROM test_table) ids
LEFT JOIN test_table ta ON ids.id = ta.id AND ta.key = 'A'
LEFT JOIN test_table tb ON ids.id = tb.id AND tb.key = 'B'
LEFT JOIN test_table tc ON ids.id = tc.id AND tc.key = 'C'
LEFT JOIN test_table td ON ids.id = td.id AND td.key = 'D'
LEFT JOIN test_table tc ON ids.id = te.id AND te.key = 'E';

В этом запросе вы получите все идентификаторы (если вы можете ответить на столбец «А», который всегда там, вы можете начать с этого). Затем вы должны присоединиться к каждому ключу для данного идентификатора.

Если вы не можете полагаться на тип данных ключа, т. Е. A может быть строкой или датой, то для каждого выбора необходимо использовать следующее:

COALESCE(ta.str_val,TO_CHAR(ta.date_val,'DD-MM-YYYY'),TO_CHAR(ta.num_val)) A,
COALESCE(tb.str_val,TO_CHAR(tb.date_val,'DD-MM-YYYY'),TO_CHAR(tb.num_val)) B,
...
etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...