MySql从行转换为动态周期列

MySql从行转换为动态周期列,mysql,sql,dynamic,row,Mysql,Sql,Dynamic,Row,我在将行数据转换为列时遇到问题。假设我在表上有这种数据,在_表中 YEAR | MONTH | ASPECT | VALUE | ------------------------------- 2015 | 1 | Target | 90 | 2015 | 1 | Score | 75 | 2015 | 2 | Target | 78 | 2015 | 2 | Score | 80 | 2015 | 3 | Target |

我在将行数据转换为列时遇到问题。假设我在表上有这种数据,在_表中

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
你知道怎么处理这件事吗


提前感谢

您正在有效地尝试创建数据透视表。您可以通过将多个联接链接在一起来实现这一点,下面是一个适用于示例数据的联接:

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;
那里的一般形式很乏味,但很容易扩展

这里有一个小提琴演示:

这里有一个更具体的版本,它使用了一点巫毒数学:

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
与此处的第一个查询相比,可以看到:

选择的列数?期间还是月份?基本上用户只能选择月份(年份总是一样的)