哎,小弟最近遇到了一个很难的困难,不知道应该如何处理,万不得于,到论坛求救,今天整天在线等待,求高人解答:
现提供测试数据:
先建立表:
----------------------------------------
create table CESHIJIJIAN
(
  凭证号  VARCHAR2(30) not null,
  单位   VARCHAR2(30) not null,
  账套   VARCHAR2(30) not null,
  年度   INTEGER not null,
  项目代码 VARCHAR2(30),
  项目名称 VARCHAR2(400),
  摘要   VARCHAR2(200),
  科目   VARCHAR2(30),
  金额   NUMBER(16,2)
)
----------------------------------------
测试数据:
INSERT INTO ceshijijian values(
'JZ-12-0002','1012200','JJ0001','2006','000101','气象探测基地项目费','支付建达监理有限项目委托代建首期款','10302','40500.00');
INSERT INTO ceshijijian values(
'JZ-12-0001','1012200','JJ0001','2006','000101','气象探测基地项目费','支付区建筑设计院有限工程设计首期款','1030502','31500.00');
INSERT INTO ceshijijian values(
'JZ-12-0003','1012200','JJ0001','2006','000101','气象探测基地项目费','支付区建筑设计院有限工程设计二期款','1030502','118125.00');
INSERT INTO ceshijijian values(
'JZ-12-0010','1012200','JJ0001','2007','000101','气象探测基地项目费','支付建达监理有限部分填土方工程招标代理','10315','12960.00');
INSERT INTO ceshijijian values(
'JZ-12-0008','1012200','JJ0001','2007','000101','气象探测基地项目费','支付建达监理有限公索体工程招标代理费','10315','49517.00');
INSERT INTO ceshijijian values(
'JZ-12-0017','1012200','JJ0001','2007','000101','气象探测基地项目费','支付四友物业有限保安合同款','10399','88000.00');
INSERT INTO ceshijijian values(
'JZ-12-0013','1012200','JJ0001','2007','000101','气象探测基地项目费','支付政分政专户补交基础设施配套费','10101','20910.96');
INSERT INTO ceshijijian values(
'JZ-12-0022','1012200','JJ0001','2007','000101','气象探测基地项目费','支付华恒工程有限公索体工程五期款','10101','567520.66');
INSERT INTO ceshijijian values(
'JZ-12-0016','1012200','JJ0001','2007','000101','气象探测基地项目费','支付番信城害虫防治有限白蚁防治','10399','10000.00');
INSERT INTO ceshijijian values(
'JZ-12-0027','1012200','JJ0001','2007','000101','气象探测基地项目费','支付淮安河海水利水电建筑安装工程有限填土方工程首期款','10101','1138307.68');
INSERT INTO ceshijijian values(
'JZ-09-0001','1012200','JJ0001','2008','000101','气象探测基地项目费','支付南电电力工程有限临电高压电气工程结算费','10101','65447.31');
INSERT INTO ceshijijian values(
'JZ-04-0001','1012200','JJ0001','2008','000101','气象探测基地项目费','支付华恒工程有限','10101','696770.00');
INSERT INTO ceshijijian values(
'JZ-01-0001','1012200','JJ0001','2008','000101','气象探测基地项目费','支付南电电力工程有限电房工程款','10101','614000.62');
INSERT INTO ceshijijian values(
'JZ-08-0001','1012200','JJ0001','2008','000101','气象探测基地项目费','支付电信设计有限公饲能化系统设计费','10201','18000.00');
INSERT INTO ceshijijian values(
'JZ-06-0002','1012200','JJ0001','2008','000101','气象探测基地项目费','支付方欣科技有限视频会商系统二期款','10201','98848.50');
INSERT INTO ceshijijian values(
'JZ-12-0002','1012200','JJ0001','2008','000101','气象探测基地项目费','支付建筑行业劳动保险金委员会办公室劳保金','10301','215657.85');
INSERT INTO ceshijijian values(
'JZ-06-0001','1012200','JJ0001','2008','000101','气象探测基地项目费','支付政分政专户填土方工程质量监督费','10309','1422.88');
INSERT INTO ceshijijian values(
'JZ-10-0001','1012200','JJ0001','2008','000101','气象探测基地项目费','支付区鹏展日用茶行的建筑拆除工程款','10399','35867.60');
INSERT INTO ceshijijian values(
'JZ-05-0001','1012200','JJ0001','2008','000101','气象探测基地项目费','支付临海水务有限公碎江供水分司政水接入','10399','4054.40');
INSERT INTO ceshijijian values(
'JZ-12-0004','1012200','JJ0001','2008','000101','气象探测基地项目费','支付政分防空地下室易地费','10101','32580.00');
INSERT INTO ceshijijian values(
'JZ-12-0005','1012200','JJ0001','2008','000101','气象探测基地项目费','支付政分防空地下室易地费',' 10101','213.00');
INSERT INTO ceshijijian values(
'JZ-12-0003','1012200','JJ0001','2008','000101','气象探测基地项目费','支付秀珀装饰工程有限地坪漆工程款','10101','38730.00');
INSERT INTO ceshijijian values(
'JZ-12-0001','1012200','JJ0001','2008','000101','气象探测基地项目费','支付南电电力工程有限万顷沙分临电低压电气工程','10101','23653.79');
INSERT INTO ceshijijian values(
'JZ-12-0001','1012700','JJ0001','2008','000101','()化工区应急监控系统项目','拨付安全生产科学研究院化工区监控系统设计方案合同第一期费用','1030502','140000.00');
INSERT INTO ceshijijian values(
'JZ-10-0001','1012700','JJ0001','2008','000101','()化工区应急监控系统项目','拨付电信设计有限化工区应急监控系统可研报告编制费用','10307','75000.00');
INSERT INTO ceshijijian values(
'JZ-12-0001','1012700','JJ0001','2009','000101','()化工区应急监控系统项目','拨付恒茂监理有限化工区监控系统工程第二期监理费','1031102','120000.00');
INSERT INTO ceshijijian values(
'JZ-10-0002','1012700','JJ0001','2009','000101','()化工区应急监控系统项目','拨付机电安装有限化工区监控系统工程第一期施工进度款','10102','925362.30');
INSERT INTO ceshijijian values(
'JZ-09-0001','1012700','JJ0001','2009','000101','()化工区应急监控系统项目','拨付机电安装有限化工区监控系统工程预付款','10102','6453656.95');
INSERT INTO ceshijijian values(
'JZ-12-0002','1012700','JJ0001','2009','000101','()化工区应急监控系统项目','拨付机电安装有限化工区监控系统工程第三期施工进度款','10102','5709762.00');
INSERT INTO ceshijijian values(
'JZ-11-0003','1012700','JJ0001','2009','000101','()化工区应急监控系统项目','拨付机电安装有限化工区监控系统工程第二期施工进度款','10102','5070486.67');
INSERT INTO ceshijijian values(
'JZ-11-0001','1012700','JJ0001','2009','000101','()化工区应急监控系统项目','拨付南粤工程监理有限化工区监控系统工程招标代理费','10315','107990.18');
INSERT INTO ceshijijian values(
'JZ-11-0002','1012700','JJ0001','2009','000101','()化工区应急监控系统项目','拨付恒茂监理有限化工区监控系统工程监理费','1031102','48000.00');
INSERT INTO ceshijijian values(
'JZ-10-0001','1012700','JJ0001','2009','000101','()化工区应急监控系统项目','拨付安全生产科学研究院化工区监控系统工程设计费','1030502','140000.00');
INSERT INTO ceshijijian values(
'JZ-04-0001','1012700','JJ0001','2010','000101','()化工区应急监控系统项目','拨付机电安装有限化工区监控系统工程第四期施工进度款','10102','659695.00');
INSERT INTO ceshijijian values(
'JZ-09-0001','1012700','JJ0001','2010','000101','()化工区应急监控系统项目','拨付恒茂监理有限化工区监控系统工程第三期监理费','1031102','48000.00');
INSERT INTO ceshijijian values(
'JZ-12-0002','1012701','JJ0001','2008','000101','应急办公场所项目','拨付省装饰总办公室装修第二期工程款','10101','165603.00');
INSERT INTO ceshijijian values(
'JZ-11-0001','1012701','JJ0001','2008','000101','应急办公场所项目','拨付省装饰总办公室装修第一期工程款','10101','165603.00');
INSERT INTO ceshijijian values(
'JZ-12-0001','1012701','JJ0001','2008','000101','应急办公场所项目','拨付南粤工程监理有限办公室装修招标代理费','10315','4713.67');
INSERT INTO ceshijijian values(
'JZ-07-0001','1012701','JJ0001','2009','000101','应急办公场所项目','拨付重工监理有限办公楼装修工程监理费','1031102','7641.00');
INSERT INTO ceshijijian values(
'JZ-05-0001','1012701','JJ0001','2009','000101','应急办公场所项目','拨付省装饰总办公楼装修工程第三期费用','10101','47315.00');
INSERT INTO ceshijijian values(
'JZ-08-0005','1013700','JJ0050','2011','000101','区体育中心工程','补录08年支付 体育馆工程土建主体工程第二期工程款','10101','6621303.00');
INSERT INTO ceshijijian values(
'JZ-08-0005','1013700','JJ0050','2011','000101','区体育中心工程','补录08年支付 体育馆工程等项目服务项目招标','10336','130460.00');
INSERT INTO ceshijijian values(
'JZ-08-0004','1013700','JJ0050','2011','000101','区体育中心工程','补录08年支付体育馆土建主体工程第一期预付款','10101','27000000.00');
INSERT INTO ceshijijian values(
'JZ-08-0004','1013700','JJ0050','2011','000101','区体育中心工程','补录08年支付体育馆土建主体工程第一期工程款','10101','9918616.00');
INSERT INTO ceshijijian values(
'JZ-08-0005','1013700','JJ0050','2011','000101','区体育中心工程','补录08年支付 体育馆工程第三期工程费','10301','750000.00');
INSERT INTO ceshijijian values(
'JZ-08-0001','1013700','JJ0050','2011','000101','区体育中心工程','补录08年支付体育馆第一期服务费','10301','750000.00');
INSERT INTO ceshijijian values(
'JZ-08-0003','1013700','JJ0050','2011','000101','区体育中心工程','补录08年支付体育馆工程第二期工程费','10301','750000.00');
INSERT INTO ceshijijian values(
'JZ-08-0005','1013700','JJ0050','2011','000101','区体育中心工程','补录08年支付 体育馆工程设计第三期费用','10305','3272670.00');
INSERT INTO ceshijijian values(
'JZ-08-0005','1013700','JJ0050','2011','000101','区体育中心工程','补录08年支付 体育馆工程地质灾害危险性评估第二期费用','10305','31200.00');
-------------------------------------------------------
------------------------------------------------------=
最终我所需要得到的数据*********************************
就是要分开要得到这个项目在每一年的累积,和历史的累积。
所需要的结果附上图片,请各位大侠帮忙,不是小弟不努力,是真的没想到办法,求助。

解决方案 »

  1.   

    难得有个有数据的,还木有图。select 凭证号, nvl(单位,decode(grouping(年度),1,'年度合计','项目累计')) 单位, 账套, nvl(年度,年度||'') 拷贝年度, 项目代码, 项目名称, 摘要, 科目, 
    --grouping(单位),grouping(年度), grouping(年度||''),decode ( grouping(单位)*10+grouping(年度||''),11, sum(金额) over( order by nvl(年度,年度||''),凭证号),10,sum(金额),金额) 最终金额 from ceshijijiangroup by grouping sets((凭证号, 单位, 账套, 年度, 项目代码, 项目名称, 摘要, 科目, 金额),(年度),(年度||''))
    order by 拷贝年度,凭证号,grouping(年度||'')
      

  2.   

    select 凭证号, nvl(单位,decode(grouping(年度),1,'年度合计','项目累计')) 单位, 账套, nvl(年度,年度||'') 拷贝年度, 项目代码, 项目名称, 摘要, 科目, 
    grouping(单位),grouping(年度||''),grouping(年度), decode ( grouping(单位)*10+grouping(年度||''),11, sum(金额) over(partition by 项目代码 order by nvl(年度,年度||''),凭证号),10,sum(金额) ,金额) 最终金额 from ceshijijiangroup by grouping sets((凭证号, 单位, 账套, 年度, 项目代码, 项目名称, 摘要, 科目, 金额),(项目代码,年度),(项目代码,年度||''))
    order by 项目代码,拷贝年度,凭证号,grouping(年度||'')
      

  3.   

    如果要将本年合计放在凭证号的那一列,不要在单位那一列怎么实现呢?
    你现在的结果出来
    -------------------------
    凭证号          单位
    JZ-12-0003 1012200 
    JZ-12-0002      1012200 
                    本年合计
                      累积合计
    --------------------------
    我需要的结果为:
    -------------------------
    凭证号          单位
    JZ-12-0003 1012200 
    JZ-12-0002      1012200 
    本年合计          1012200
    累积合计         1012200                         
    --------------------------
    谢谢
      

  4.   

    把  "凭证号, nvl(单位,decode(grouping(年度),1,'年度合计','项目累计'))   单位, "换成"nvl(凭证号,decode(grouping(年度),1,'年度合计','项目累计')) 凭证号, 单位, "
      

  5.   

    可是按照你这么写,单位,跟账套就出不来了:
    -------------现在数据库出来的
    4 年度合计 2006 000101
    5 项目累计 2006 000101
    -------------我要的是
    4 年度合计 1012200 JJ0001 2006 000101
    5 项目累计 1012200 JJ0001 2006 000101
    谢谢。
    请帮忙再看看吧。
      

  6.   


    首先,上面的sql算的是一个年度一个项目里的所有单位和帐套,如果你要显示,显示的是哪个?如果你确定一个年度一个项目里面只有一个单位和一个帐套select 凭证号, nvl(单位,decode(grouping(年度),1,'年度合计','项目累计')) 单位, 账套, nvl(年度,年度||'') 拷贝年度, 项目代码, 项目名称, 摘要, 科目, 
    --grouping(单位),grouping(年度||''),grouping(年度), decode ( grouping(单位)*10+grouping(年度||''),11, sum(金额) over(partition by 单位, 账套,项目代码 order by nvl(年度,年度||''),凭证号),10,sum(金额) ,金额) 最终金额 from ceshijijiangroup by grouping sets((凭证号, 单位, 账套, 年度, 项目代码, 项目名称, 摘要, 科目, 金额),(单位, 账套,项目代码,年度),(单位, 账套,项目代码,年度||''))
    order by 项目代码,拷贝年度,凭证号,grouping(年度||'')
      

  7.   

    兄弟,要不你告诉我你的QQ,我加你QQ行吗?