Транспонировать несколько столбцов WRT в строку в MySQL

Я искал транспонирование и повороты, но ничего подобного не нашел. Входная таблица:

+-----+-------+-------+-------+
| TID |  TP1  |  TP2  |  TP3  |
+-----+-------+-------+-------+
| A   | link1 | link1 | link3 |
| B   | link3 |       |       |
| C   | link2 |       |       |
+-----+-------+-------+-------+

Необходимая выходная таблица:

+-----+--------+-------+
| TID | TP Num |  REF  |
+-----+--------+-------+
| A   |      1 | link1 |
| A   |      2 | link1 |
| A   |      3 | link3 |
| B   |      1 | link3 |
| C   |      1 | link2 |
+-----+--------+-------+

person Community    schedule 31.12.2015    source источник


Ответы (1)


Это немного сложно, и вам нужно будет использовать объединение всех, чтобы иметь вертикальное представление, а затем, используя пользовательские переменные, получить числа как-то так

select TID,`TP Num`,REF from (
  select TID,REF,@rn:= if (@prev_tid = TID,@rn+1,1) as `TP Num`,@prev_tid:=TID  from
  (
    select
    TID,REF from
    (
        select TID , TP1 as REF from mytable where TP1 is not null and TP1 <> ''
        union all 
        select TID , TP2 as REF from mytable where TP2 is not null and TP2 <> ''
        union all
        select TID , TP3 as REF from mytable where TP3 is not null and TP3 <> ''
    )x
  )y,(select @rn:=0,@prev_tid:=null)z
  order by TID,REF 
)x;

http://sqlfiddle.com/#!9/1d15c/14

person Abhik Chakraborty    schedule 31.12.2015
comment
Не могли бы вы объяснить, что такое @rn:= - person ; 31.12.2015
comment
@rn — определяемая пользователем переменная, которая работает для текущего сеанса запроса. Поэтому я инициализировал его 0 как select @rn:=0. Теперь в запросе я вычислил TP Num и проверил, совпадает ли предыдущий TID с текущим, а затем увеличил @rn на 1, иначе установил его на 1. - person Abhik Chakraborty; 31.12.2015
comment
Ах хорошо. Мне нужно реализовать это в postgres, есть идеи, как это перевести? - person ; 31.12.2015
comment
оу, я думал, что это mysql.. я не знаю, как это сделать на postgres - person Abhik Chakraborty; 31.12.2015