2015-04-07 3 views
0

У меня возникла проблема преобразования данных строк в столбцы. Скажем, у меня есть такие данные по таблице the_tableКолонки динамического периода MySql от преобразования строк

YEAR | MONTH | ASPECT | VALUE | 
------------------------------- 
2015 | 1 | Target | 90 | 
2015 | 1 | Score | 75 | 
2015 | 2 | Target | 78 | 
2015 | 2 | Score | 80 | 
2015 | 3 | Target | 90 | 
2015 | 3 | Score | 100 | 
2015 | 4 | Target | 60 | 
2015 | 4 | Score | 90 | 

Тогда я хотел бы изменить его во что-то вроде этого. Количество столбцов динамически выбирается пользователем (по диапазону). Например, если выбирает пользователь в диапазоне между периодом 1 и 3, то результат будет

ASPECT | PERIOD1 | PERIOD2 | 
---------------------------- 
Target | 90 | 78 | 
Score | 75 | 80 | 

на данный момент, я использую запрос, такие как

select PERIOD1.ASPECT, PERIOD1.VALUE, PERIOD2.VALUE 
from 
(
select ASPECT, VALUE 
from the_table 
where year = 2015 
and period = 1 
) PERIOD1, 
(
select ASPECT, VALUE 
from the_table 
where year = 2015 
and period = 2 
) PERIOD2 
where PERIOD1.ASPECT = PERIOD2.ASPECT 

Есть ли у вас какие-либо идеи, как бороться с этим вещь?

Заранее спасибо

+0

Количество выбранных столбцов? Период или месяц? – jarlh

+0

В принципе пользователь может выбрать только месяц (год все равно) – jonimaulana

ответ

0

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

select q1.aspect, q1.value 'period 1', q2.value 'period 2', q3.value 'period 3' 
    from 
    (select aspect, value 
     from the_table 
     where month = 1 
    ) q1 
    inner join 
    (select aspect, value 
     from the_table 
     where month = 2 
    ) q2 
    on q1.aspect = q2.aspect 
    inner join 
    (select aspect, value 
     from the_table 
     where month = 3 
    ) q3 
    on q1.aspect = q3.aspect; 

Общий вид есть утомительно, но просто расширить.

Вот демо скрипку: http://sqlfiddle.com/#!9/6eb5d/9

А вот немного более конкретный вариант, который использует немного вуду математике работать:

select aspect, 
    sum(value * (1 - abs(sign(month - 1)))) as 'period 1', 
    sum(value * (1 - abs(sign(month - 2)))) as 'period 2', 
    sum(value * (1 - abs(sign(month - 3)))) as 'period 3' 
from the_table 
group by aspect 

Что можно увидеть по сравнению с первым запросом здесь: http://sqlfiddle.com/#!9/6eb5d/13

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