2015-04-07 26 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