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
与此处的第一个查询相比,可以看到:
选择的列数?期间还是月份?基本上用户只能选择月份(年份总是一样的)