行转换中的MySql动态周期列

时间:2015-04-07 10:10:36

标签: mysql sql dynamic row

我遇到有关将行数据转换为列的问题。我们假设我在表格 the_table

上有这种数据
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

你知道如何处理这件事吗?

提前致谢

1 个答案:

答案 0 :(得分: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