DEAR ALL:
     好,小弟以前学SQL,现在用ORACLE不方便,请各位帮忙解答下,万分感谢。
     先附测试数据先:
create table aaa
(a1 varchar2(100),
a2 varchar2(100),
a3 integer);INSERT INTO aaa values('2006','基本支出','888');
INSERT INTO aaa values('2006','基本支出','77');
INSERT INTO aaa values('2006','基本支出','676');
INSERT INTO aaa values('2006','基本支出','566');
INSERT INTO aaa values('2006','基本支出','5434');
INSERT INTO aaa values('2006','基本支出','345');
INSERT INTO aaa values('2007','基本支出','24');
INSERT INTO aaa values('2007','基本支出','2345');
INSERT INTO aaa values('2007','基本支出','45');
INSERT INTO aaa values('2007','基本支出','345');
INSERT INTO aaa values('2007','基本支出','4235');
INSERT INTO aaa values('2007','基本支出','523');
INSERT INTO aaa values('2007','基本支出','234');
INSERT INTO aaa values('2007','基本支出','123');
INSERT INTO aaa values('2008','基本支出','324');
INSERT INTO aaa values('2008','基本支出','234');
INSERT INTO aaa values('2008','基本支出','234');
INSERT INTO aaa values('2008','基本支出','324');
INSERT INTO aaa values('2009','基本支出','3242');
INSERT INTO aaa values('2009','基本支出','41');
INSERT INTO aaa values('2009','基本支出','234');     要求为:要用存储过程,建立临时表,输出以下的答案:
结果:
年度 项目  金额
2006 基本支出 888
2006 基本支出 77
2006 基本支出 676
2006 基本支出 566
2006 基本支出 5434
2006 基本支出 345
本年合计: 7986
本年累计: 7986
2007 基本支出 24
2007 基本支出 2345
2007 基本支出 45
2007 基本支出 345
2007 基本支出 4235
2007 基本支出 523
2007 基本支出 234
本年合计: 7751
项目累计: 15737
2008 基本支出 123
2008 基本支出 324
2008 基本支出 234
2008 基本支出 234
2008 基本支出 324
本年合计: 1239
项目累计: 16976
2009 基本支出 3242
2009 基本支出 41
2009 基本支出 234
本年合计: 3517
项目累计: 20493     万水千山总是情,帮帮小弟行不行,谢谢各位。

解决方案 »

  1.   


    SELECT  b.a1,b.a3 AS 年合计,SUM(b.a3)over(PARTITION BY substr(b.a1,1,1) ORDER BY b.a1) AS 总累计
    FROM (
    SELECT aaa.A1,SUM(aaa.A3) AS a3
    FROM aaa 
    GROUP BY aaa.A1
    ) b
      

  2.   

    SELECT 
    CASE WHEN c.a2 IS NOT NULL AND c.a3 IS NOT NULL THEN to_char(C.a1) ELSE '' END AS a1,
    CASE WHEN c.a2 IS NOT NULL AND c.a3 IS NULL THEN '年合计' WHEN c.a2 IS NULL AND c.a3 IS NULL THEN '项目总累计' ELSE  to_char(C.a1)  END AS a2,
    CASE WHEN c.a2 IS NOT NULL AND c.a3 IS NULL THEN c.year_total WHEN c.a2 IS NULL AND c.a3 IS NULL THEN c.p_total ELSE c.a3 END AS a3
    FROM (
    SELECT B.A1,
           B.A2,
           B.A3,
           B.YEAR_SUM AS YEAR_TOTAL,
           SUM(B.YEAR_SUM) OVER(PARTITION BY SUBSTR(B.A1, 1, 1) ORDER BY B.A1) / 3 AS P_TOTAL
      FROM (SELECT AAA.A1,
                   AAA.A2,
                   GROUPING(AAA.A1),
                   AAA.A3,
                   SUM(AAA.A3) AS YEAR_SUM
              FROM AAA
             GROUP BY ROLLUP(AAA.A1, AAA.A2, AAA.A3)) B
     WHERE B.A1 IS NOT NULL
     ORDER BY B.A1, B.A2, B.A3) C
    A1 A2 A3
    2006 2006 77
    2006 2006 345
    2006 2006 566
    2006 2006 676
    2006 2006 888
    2006 2006 5434
    年合计 7986
    项目总累计 7986
    2007 2007 24
    2007 2007 45
    2007 2007 123
    2007 2007 234
    2007 2007 345
    2007 2007 523
    2007 2007 2345
    2007 2007 4235
    年合计 7874
    项目总累计 15860
    2008 2008 234
    2008 2008 324
    年合计 1116
    项目总累计 16976
    2009 2009 41
    2009 2009 234
    2009 2009 3242
    年合计 3517
    项目总累计 20493
      

  3.   

    SELECT 
    CASE WHEN c.a2 IS NOT NULL AND c.a3 IS NOT NULL THEN to_char(C.a1) ELSE '' END AS "年度",
    CASE WHEN c.a2 IS NOT NULL AND c.a3 IS NULL THEN '年合计' WHEN c.a2 IS NULL AND c.a3 IS NULL THEN '项目总累计' ELSE  to_char(C.a2)  END AS "项目",
    CASE WHEN c.a2 IS NOT NULL AND c.a3 IS NULL THEN c.year_total WHEN c.a2 IS NULL AND c.a3 IS NULL THEN c.p_total ELSE c.a3 END AS "金额"
    FROM (
    SELECT B.A1,
           B.A2,
           B.A3,
           B.YEAR_SUM AS YEAR_TOTAL,
           SUM(B.YEAR_SUM) OVER(PARTITION BY SUBSTR(B.A1, 1, 1) ORDER BY B.A1) / 3 AS P_TOTAL
      FROM (SELECT AAA.A1,
                   AAA.A2,
                   GROUPING(AAA.A1),
                   AAA.A3,
                   SUM(AAA.A3) AS YEAR_SUM
              FROM AAA
             GROUP BY ROLLUP(AAA.A1, AAA.A2, AAA.A3)) B
     WHERE B.A1 IS NOT NULL
     ORDER BY B.A1, B.A2, B.A3) C
    第二列纠正显示问题:结果如下年度 项目 金额
    2006 基本支出 77
    2006 基本支出 345
    2006 基本支出 566
    2006 基本支出 676
    2006 基本支出 888
    2006 基本支出 5434
    年合计 7986
    项目总累计 7986
    2007 基本支出 24
    2007 基本支出 45
    2007 基本支出 123
    2007 基本支出 234
    2007 基本支出 345
    2007 基本支出 523
    2007 基本支出 2345
    2007 基本支出 4235
    年合计 7874
    项目总累计 15860
    2008 基本支出 234
    2008 基本支出 324
    年合计 1116
    项目总累计 16976
    2009 基本支出 41
    2009 基本支出 234
    2009 基本支出 3242
    年合计 3517
    项目总累计 20493
      

  4.   

    CREATE OR REPLACE PROCEDURE dealAAA is
      cursor GroupByColumn is
        select distinct a1, a2 from aaa;
      cursor DealData(v_a1 aaa.a1%type, v_a2 aaa.a2%type) is
        select *
          from aaa
         where a1 = v_a1
           and a2 = v_a2;  rowGroup groupbycolumn%rowtype;
      rowData  dealData%rowtype;
      suma3    number;
      n_total  number;
    begin
      n_total := 0;
      open GroupByColumn;
      loop
        fetch GroupByColumn
          into rowgroup;
        exit when GroupByColumn%NOTFOUND;
        if GroupByColumn%ROWCOUNT = 1 then
          dbms_output.put('年度    项目    金额');
          dbms_output.put_line('');
        end if;
      
        suma3 := 0;
        open dealData(rowgroup.a1, rowgroup.a2);
        loop
          fetch dealData
            into rowData;
          exit when dealData%NOTFOUND;
          suma3 := suma3 + rowdata.a3;
        
          dbms_output.put(rowData.a1 || '  ' || rowData.a2 || '  ' ||
                          rowData.a3);
          dbms_output.put_line('');
        end loop;
        close dealData;
        n_total := n_total + suma3;
        dbms_output.put('本年合计:' || suma3);
        dbms_output.put_line('');
        dbms_output.put('项目合计:' || n_total);
        dbms_output.put_line('');
      
      end loop;
      close GroupByColumn;
    end dealAAA;