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 万水千山总是情,帮帮小弟行不行,谢谢各位。
好,小弟以前学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 万水千山总是情,帮帮小弟行不行,谢谢各位。
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
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
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
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;