year  month amount 
1991  1    1.1 
1991  2    1.2 
1991  3    1.3 
1991  4    1.4 
1992  1    2.1 
1992  2    2.2 
1992  3    2.3 
1992  4    2.4 
查成这样一个结果 
year m1  m2  m3  m4 
1991 1.1 1.2 1.3 1.4 
1992 2.1 2.2 2.3 2.4 
===================
已有如下解法:
--1M: 
SELECT YEAR, 
SUM(CASE WHEN MONTH='1' THEN AMOUNT END) M1, 
SUM(CASE WHEN MONTH='2' THEN AMOUNT END) M2, 
SUM(CASE WHEN MONTH='3' THEN AMOUNT END) M3, 
SUM(CASE WHEN MONTH='4' THEN AMOUNT END) M4 
FROM AAA 
GROUP BY YEAR --2M: 
select year, 
(select amount from  aaa m where month=1  and m.year=b.year) as m1, 
(select amount from  aaa m where month=2  and m.year=b.year) as m2, 
(select amount from  aaa m where month=3  and m.year=b.year) as m3, 
(select amount from  aaa m where month=4  and m.year=b.year) as m4 
from aaa b group by year --3M: maybe only used on oracle 
SELECT YEAR, 
MAX(DECODE(MONTH,1,AMOUNT,0)) M1, 
MAX(DECODE(MONTH,2,AMOUNT,0)) M2, 
MAX(DECODE(MONTH,3,AMOUNT,0)) M3, 
MAX(DECODE(MONTH,4,AMOUNT,0)) M4 
FROM AAA 
GROUP BY YEAR 

但是感觉这些写法有点局限,都把月给写死了,如果月份是变化的,好像就有问题,请高手们看看,谢谢!

解决方案 »

  1.   

    想写活就用过程写
    先查一遍下表
    year  month amount 
    1991  1    1.1 
    1991  2    1.2 
    1991  3    1.3 
    1991  4    1.4 
    1992  1    2.1 
    1992  2    2.2 
    1992  3    2.3 
    1992  4    2.4 
    然后把不重复的年月得到最好是按照年月拼接起来
    然后用循环拼接成
    v_MOTH:=V_MOTH || MAX(DECODE(MONTH,1,AMOUNT,0)) (这个拼接语句你自己写吧!)
    然后再在最终的sql语句里把变量拼接进去!
    SELECT YEAR, || v_MOTH ||
    FROM AAA 
    GROUP BY YEAR 
    上面给你介绍的是一个思路,具体的代码要你自己去写!