题目如下:已知表tab:
T1 F1 F2  F3
A 1 甲类支出 1000
A 2 已类支出 2000
A 3 丙类支出 3000
B 1 甲类支出 4000
B 3 丙类支出 2000
写sql语句得到的结果如下表:T1 甲类支出 乙类支出 丙类支出
A 1000  2000  3000
B 4000  0  2000高人帮忙指点下

解决方案 »

  1.   

    select T1,
           sum(decode(F2),'甲类支出',F3) 甲类支出,
           sum(decode(F2),'乙类支出',F3) 乙类支出,
           sum(decode(F2),'丙类支出',F3) 丙类支出
    from tab
    group by T1;
      

  2.   

    select T1,
    nvl(sum(decode(F1,1,F3,0)),0) 甲类支出,
    nvl(sum(decode(F1,2,F3,0)),0) 乙类支出,
    nvl(sum(decode(F1,3,F3,0)),0) 丙类支出
    from tab
    group by T1;
      

  3.   

    select T1,
    sum(decode(F2,'甲类支出',F3)) 甲类支出,
    sum(decode(F2,'乙类支出',F3)) 乙类支出,
    sum(decode(F2,'丙类支出',F3)) 丙类支出
    from tab
    group by T1;
    上面)位置放错了,应该是这个,呵呵。
      

  4.   

    这是涉及行转列问题
    如果项目数据固定(如这儿的甲、乙、丙类支出),使用普通SQL就行了,
    如果项目数据不固定,则需要用PL/SQL动态拼接了
    另外也可以使用case函数替代decode来实现
    这种贴子很多,参考
    http://topic.csdn.net/u/20100322/16/102d4dfd-4185-459b-b74f-19bf33053285.html
      

  5.   

    with t1 as 
    (
    select 'A' T1,1 f1,'甲类支出' F2,1000 F3 from dual
    union all
    select 'A' T1,2 f1,'已类支出' F2,2000 F3 from dual
    union all
    select 'A' T1,3 f1,'丙类支出' F2,3000 F3 from dual
    union all
    select 'B' T1,1 f1,'甲类支出' F2,4000 F3 from dual
    union all
    select 'B' T1,3 f1,'丙类支出' F2,2000 F3 from dual
    )
    select t1,
      sum(case when f1 = 1 then f3 else null end) "甲类支出",
        sum(case when f1 = 2 then f3 else null end) "已类支出",
          sum(case when f1 = 3 then f3 else null end) "丙类支出"
    from t1 
    group by "T1"