2010-04-19 5 views
0

У меня есть таблица MySQL InnoDB выложил вот так: идентификатор (INT), run_id (INT), ELEMENT_NAME (VARCHAR), значение (текст), line_order, column_orderMySQL Значение столбца Pivot

`MyDB`.`MyTable` (
    `id` bigint(20) NOT NULL, 
    `run_id` int(11) NOT NULL, 
    `element_name` varchar(255) NOT NULL, 
    `value` text, 
    `line_order` int(11) default NULL, 
    `column_order` int(11) default NULL 

Это используется для хранения данных, сгенерированных программой Java, которая использовалась для вывода этого в формате CSV, и, следовательно, для строки_порядка и column_order. Допустим, у меня есть 4 записей (согласно описанию таблицы):

1,1,'ELEMENT 1','A',0,0 
2,1,'ELEMENT 2','B',0,1 
3,1,'ELEMENT 1','C',1,0 
4,1,'ELEMENT 2','D',1,1 

Я хочу, чтобы повернуть эти данные в представлении для отчетности, так что она будет выглядеть больше как CSV будет, где выход будет выглядеть это:

--------------------- 
|ELEMENT 1|ELEMENT 2| <--- Element Name 
--------------------- 
| A  | B  | <--- Value From line_order = 0 
--------------------- 
| C  | D  | <--- Value From line_order = 1 
--------------------- 

Данные, поступающие очень динамично; он может быть в любом порядке, может быть любым из более чем 900 различных элементов, а значение может быть любым. Идентификатор Run связывает их все вместе, и порядок строк и столбцов в основном позволяет мне узнать, где пользователь хочет вернуть данные в порядке. Я хочу, чтобы он сортировал/группировал строки и порядок столбцов в отображаемой матрице.

ответ

1

Вы можете сделать это с автообъединение:

select e1.element_name, e1.value, e2.value 
from MyTable e1 
inner join MyTable e2 
on e1.element_name = e2.element_name 
and e2.line_order = 1 
where e1.line_order = 0 

От выбирает line_order = 1, внутреннее соединение выбирает line_order = 2.

Коммутатор inner join до cross join, если вы хотите вернуть элементы только с одной строкой.

В ответ на ваш комментарий, вы могли бы выписать фиксированное число элементов, таких как:

select 
    line_order 
, max(case when element_name = 'element 1' then value end) as Element1Value 
, max(case when element_name = 'element 2' then value end) as Element2Value 
, max(case when element_name = 'element 3' then value end) as Element3Value 
, ... 
from MyTable 
group by line_order 

max() конструкция предполагает, что (element_name, line_order) является уникальным.

+0

Андомар, спасибо вам за помощь, но часть проблемы заключается в том, что я не знаю, сколько строк будет. Иногда line_order достигает примерно 100, он может достигать 10 000 – ashurexm

+0

@manyxcxi: похоже, что вы хотите развернуть произвольное количество столбцов. Не думайте, что есть реальный способ сделать это в MySQL – Andomar

+0

Что делать, если я знаю имена элементов, которые я хочу, но не знаю количество строк? Таким образом, количество столбцов будет предварительно задано в запросе ... IE ищет поворот на element_name IN ('ELEMENT1', 'ELEMENT2', 'ELEMENT3') – ashurexm

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