2013-08-01 2 views
-2

Допустим, в моем случае, у меня есть таблица, как:Транспонирование данных в MySQL - от значений столбца к строке значения

id group_id text  data empty1 empty2 empty3 empty4 empty5 

1 20  AB  data1 
2 20  AB  data2 
3 21  AC  data3 
4 20  AB  data4 
5 21  AC  data5 
6 22  AD  data6 
7 22  AD  data7 
8 22  AD  data8 
9 23  AF  data9 

Как вы можете видеть - поле «текст» содержит некоторые те же данные - в соответствии с полем " group_id. Единственное отличие, что «текст» является буквенно-цифровым, а «group_id» - числовым. Поле «данные» содержит различную текстовую информацию (varchar (255))

Возможно ли и как обрабатывать таблицу внутри MySQL для копирования (или перемещения) значений из поля «данные» в «пустые» поля в соответствии с с group_id, следующим образом:

id group_id text  data  empty1  empty2  empty3 empty4 empty5 

1 20  AB  data1  data1  data2  data4 
2 20  AB  data2 
3 21  AC  data3  data3  data5 
4 20  AB  data4 
5 21  AC  data5 
6 22  AD  data6  data6  data7  data8 
7 22  AD  data7 
8 22  AD  data8 
9 23  AF  data9  data9 

Может быть, это легче заполнить все первые - я имею в виду

id group_id text  data  empty1  empty2  empty3 empty4 empty5 

1 20  AB  data1  data1  data2  data4 
2 20  AB  data2  data1  data2  data4 

и в качестве последнего шага - просто удалить дубликаты опирающиеся на group_id - так что в конце концов мы иметь четкую таблицу FINAL, такую ​​как

id group_id text  data  empty1  empty2  empty3 empty4 empty5 

1 20  AB  data1  data1  data2  data4 
3 21  AC  data3  data3  data5 
6 22  AD  data6  data6  data7  data8 
9 23  AF  data9  data9 

ответ

7

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

Базовый синтаксис, чтобы получить данные в формате, который вы хотите будет:

select d.id, 
    d.group_id, 
    d.text, 
    t.data, 
    d.empty1, 
    d.empty2, 
    d.empty3, 
    d.empty4, 
    d.empty5 
from yourtable t 
inner join 
(
    select min(id) id, 
    group_id, 
    text, 
    max(case when row=1 then data end) empty1, 
    max(case when row=2 then data end) empty2, 
    max(case when row=3 then data end) empty3, 
    max(case when row=4 then data end) empty4, 
    max(case when row=5 then data end) empty5 
    from 
    (
    select id, 
     group_id, 
     text, 
     data, 
     @row:=case 
       when @pg=group_id and @pt=text 
       then @row 
       else 0 end +1 row, 
     @pg:=group_id, 
     @pt:=text 
    from yourtable 
    cross join 
    (
     select @row:=0, @pg:=0, @pt:=null 
    ) c 
    order by group_id, text, id 
) src 
    group by group_id, text 
    order by group_id, text, id 
) d 
    on t.id = d.id 

См SQL Fiddle with Demo. Этот запрос даст вам результат:

| ID | GROUP_ID | TEXT | DATA | EMPTY1 | EMPTY2 | EMPTY3 | EMPTY4 | EMPTY5 | 
----------------------------------------------------------------------------- 
| 1 |  20 | AB | data1 | data1 | data2 | data4 | (null) | (null) | 
| 3 |  21 | AC | data3 | data3 | data5 | (null) | (null) | (null) | 
| 6 |  22 | AD | data6 | data6 | data7 | data8 | (null) | (null) | 
| 9 |  23 | AF | data9 | data9 | (null) | (null) | (null) | (null) | 
+0

Этот код, созданный @bluefeet, отлично работает! Теперь ищем способ настройки таблицы, где есть дополнительные поля BETWEEN ** id ** и ** group_id ** следующим образом: ** id **; номер ; имя ; ** group_id **; ** текст **; **данные** ; заглавие ; описание ; ** empty1; empty2; empty3; empty4; empty5 **; уровень; ранг; Дата ; время; поэтому поля NON-BOLD должны быть оставлены INTACT. – Serge

+0

@Serge, если у вас есть другая проблема, требующая другого решения, пожалуйста, не изменяйте здесь требования - создайте новый вопрос. В любом случае никто не может прочитать, что вы пытаетесь продемонстрировать в этом комментарии. –

+0

@Serge Возможно, вы могли взять информацию, которую Bluefeet дал вам, и, возможно, использовать ее, чтобы придумывать будущие ответы на ваши проблемы, используя процесс, который я часто называю обучением. – Zane

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