2015-07-18 2 views
0

Оригинальная таблица:Объединить несколько подобных строк в один с новыми столбцами

Name   Age  Contact_type Contact 
Alex   20  SMS   12345 
Alex   20  Email   [email protected] 
Alex   20  SMS   54321 
Bob   35  SMS   23456 

Я хочу сделать это как:

Name   Age  Contact_type1 Contact_1 Contact_type2 Contact_2  Contact_type3 Contact_3 
Alex   20   SMS   12345  Email  [email protected]  SMS   23456 
Bob   35   SMS   23456 

Если имя и возраст дублированы, совместить 2 (или более) строки в 1 строку с новым столбцом, как показано выше.

Я хочу сделать это, найдя те же «Имя» и «Возраст», и используя DISTINCT CONTACT, как случай, когда счетчик отличается (контакт)> 0, но кажется, что происходит сильная синтаксическая ошибка. Есть ли более разумный способ сделать это?

ответ

0

Это не тривиальный стержень, потому что вам нужно создать порядковый номер для поворота. Код выглядит так:

select name, 
     max(case when seqnum = 1 then contact_type end) as contacttype1, 
     max(case when seqnum = 1 then contact end) as contact1, 
     max(case when seqnum = 2 then contact_type end) as contacttype2, 
     max(case when seqnum = 2 then contact end) as contact2, 
     max(case when seqnum = 3 then contact_type end) as contacttype3, 
     max(case when seqnum = 3 then contact end) as contact3 
from (select ot.*, 
      (@rn := if(@n = name, @rn + 1, 
         if(@n := name, 1, 1) 
         ) 
      ) as seqnum 
     from originaltable ot cross join 
      (select @rn := 0, @n := '') params 
     order by name 
    ) ot 
group by name; 

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

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