我有一张表字段名:
yp varchar2(2) --药品类型(1-药品,2-诊疗)
fy varchar2(4) --费用类型(1-西药,2-中药品,3-材料等)
yblx varcahr2(2)--医保类型(1-甲类,2-乙类,3-丙类)
dj number(14,4)--单价
sl number(9)--数量
je number(14, 4)--金额想要一简单的写法,不想用一直用union all来实现 
要实现的效果如下:
类型 项目 单价 数量 金额
药品 药品合计 2294.2094 8527 11431.7122
西药 2294.2094 8527 11431.7122
甲类 xxx xxx xx
乙类 xxx xxx xx
丙类 xxx xxx xx
诊疗 诊疗合计 3333 345 3445565
检查费 1290.2 30 1336.2
甲类 xxx xxx xx
乙类 xxx xxx xx
丙类 xxx xxx xx
床位费 31 17 271
甲类 xxx xxx xx
乙类 xxx xxx xx
丙类 xxx xxx xx
治疗费 41 13 415
甲类 xxx xxx xx
乙类 xxx xxx xx
丙类 xxx xxx xx
化验费 1094.6 134 1166
甲类 xxx xxx xx
乙类 xxx xxx xx
丙类 xxx xxx xx

解决方案 »

  1.   

    使用group by rollup子句来实现
      

  2.   

    group by rollup
    group by grouping sets
    都可以
      

  3.   


    create table yplist(
     yp varchar2(2),--1-药品,2-诊疗
     fy varchar2(2),--1-西药,2-中药,3-检查,4-材料
     yblx varchar2(3),--1--甲类,2-乙类,3-丙类
     dj number(14,4),--单价
     sl number(9),--数量
     je number(14,4)--金额
    );
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('1','1','1',2,2,4);
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('1','2','1',2,2,4);
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('1','1','2',2,2,4);
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('1','2','2',2,2,4);
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('1','1','3',2,2,4);
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('1','2','3',2,2,4);
    --
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('2','3','1',2,2,4);
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('2','4','1',2,2,4);
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('2','3','2',2,2,4);
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('2','4','2',2,2,4);
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('2','3','3',2,2,4);
    insert into yplist(yp,fy,yblx,dj,sl,je)
    values('2','4','3',2,2,4);
      

  4.   

    create table TestBill(
    yp varchar2(8),
    fy varchar2(16),
    yblx varchar2(8),
    dj number(14,4),
    sl number(9),
    je number(14,4)
    )
    insert into TestBill
    select '药品','西药','甲类',400,200,200 from dual
    union all
    select '药品','西药','乙类',300,200,100 from dual
    union all
    select '药品','西药','丙类',500,300,300 from dual
    union all
    select '诊疗','检查费','甲类',200,300,200 from dual
    union all
    select '诊疗','检查费','乙类',300,200,400 from dual
    union all
    select '诊疗','床位费','乙类',500,690,230 from dual
    union all
    select '诊疗','床位费','丙类',700,200,400 from dual
    union all
    select '诊疗','化验费','甲类',600,300,200 from dualselect case when grouping(fy)=1 then yp when grouping(yblx)=1 then fy else yblx end, 
           case when grouping(fy)=1 then yp||'合计' end,
           sum(dj),sum(sl),sum(je)
    from TestBill group by rollup(yp,fy,yblx)截图麻烦,LZ自己试下是不是你自己要的结果,数字的地方我直接用中文代替了,用的时候转换下就OK