我遇到有关将行数据转换为列的问题。我们假设我在表格 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
你知道如何处理这件事吗?
提前致谢
答案 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