SQL создает столбцы из группы по коллекции

У меня есть таблица в следующем виде

chain   |branch
________|________|
    a   |UK
    a   |US
    b   |ISRAEL
    b   |UK
    b   |FRANCE
    b   |BELGIUM
    c   |NIGERIA

и я хотел бы создать новую таблицу в следующем формате

chain   |branch_1|branch_2|branch_3|branch_4
________|________|________|________|________|
    a   |  UK    |  US    |--------|--------|
    b   |  ISRAEL|  UK    | FRANCE |BELGIUM |
    c   | NIGERIA|--------|--------|--------|

Для дальнейшего пояснения представьте, что вы можете сгруппировать по (цепочке), где агрегатная функция является идентичностью, так что

group_1->(element1,element2,element3,..,elementM)
group_2->(element1,element2,element3,..,elementN)
...
group_X->(element1,element2,element3,..,elementZ)

поэтому будет создана новая таблица, в которой будут столбцы R + K, где R — количество столбцов, по которым мы группируемся (в нашем случае это столбец «цепочка», поэтому R = 1), а K — максимальное количество групп. (в нашем случае это четыре, что соответствует цепочке «b»)

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

РЕДАКТИРОВАТЬ: ЭТО НЕ СВОДНАЯ ТАБЛИЦА В этом случае сводная таблица будет

chain   |UK      |US      |ISRAEL  |FRANCE  |BELGIUM |NIGERIA |
________|________|________|________|________|________|________|
____a___|____1___|____1___|____0___|____0___|____0___|____0___|
____b___|____1___|____0___|____1___|____1___|____1___|____0___|
____c___|____0___|____0___|____0___|____0___|____0___|____1___|

Спасибо!


person BigScratch    schedule 18.08.2015    source источник
comment
возможный дубликат Как создать сводную таблицу в Transact/SQL?   -  person Taher Rahgooy    schedule 18.08.2015
comment
Это не сводная таблица. В сводной таблице значения ячеек будут столбцами, мы не делаем то же самое.   -  person BigScratch    schedule 18.08.2015
comment
Конечно, это сводная таблица, к сожалению, Teradata не поддерживает функцию PIVOT. Но чтобы получить результат для неизвестного количества столбцов, вам всегда понадобится динамический SQL в хранимой процедуре, создающий необходимый SQL на лету....   -  person dnoeth    schedule 18.08.2015
comment
Поправьте меня, если я ошибаюсь, но «традиционная» сводная таблица имеет в каждом новом столбце одно из уникальных значений, содержащихся в группах, поэтому новыми столбцами в нашем случае будут Великобритания, США, ИЗРАИЛЬ, ФРАНЦИЯ, БЕЛЬГИЯ, НИГЕРИЯ. , тогда как значения в каждом из этих столбцов будут соответствовать агрегатной функции в третьем начальном столбце, такой как сумма, среднее значение, переменная или любая другая функция, которая нам нравится.   -  person BigScratch    schedule 19.08.2015
comment
Это та же логика, что и у сводной таблицы :-) Кстати, а зачем вам денормализованная таблица?   -  person dnoeth    schedule 20.08.2015
comment
Результаты более или менее одинаковы, да, я согласен :) Таким образом, легко найти, сколько из них имеют одну ветку, две ветки и т. д., когда вас не волнуют страны. Другое дело, что таким образом вы избегаете перечисления стран (которых будет около 200), а заботитесь только о наборе стран для каждой компании.   -  person BigScratch    schedule 20.08.2015


Ответы (1)


Вы можете сделать это с помощью условной агрегации и row_number():

select chain,
       max(case when seqnum = 1 then branch end) as branch_01,
       max(case when seqnum = 2 then branch end) as branch_02,
       max(case when seqnum = 3 then branch end) as branch_03,
       max(case when seqnum = 4 then branch end) as branch_04
from (select t.*,
             row_number() over (partition by chain order by branch) as seqnum
      from table t
     ) t
group by chain;

Примечание. В вашей таблице нет столбца, определяющего порядок строк. Таблицы SQL представляют неупорядоченные наборы. Без такого столбца не существует концепции того, что одна строка находится перед или после другой. Итак, эта версия упорядочивается по названию ветки. Вы можете заказать что угодно, заменив пункт order by на row_number().

person Gordon Linoff    schedule 18.08.2015
comment
Спасибо! Однако в этом случае предполагается, что мы знаем максимальное число априори. Меня больше интересует более общий «шаблон», в котором эти столбцы могут извлекаться автоматически. В моем случае это решение должно работать :) - person BigScratch; 18.08.2015
comment
@Большая Царапина. . . SQL-запрос заранее определяет все свои столбцы. Следовательно, вы не можете делать то, что хотите, с помощью одного запроса. Вам нужно будет использовать динамический SQL. - person Gordon Linoff; 19.08.2015