我有一张表字段名:
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.   

    如:
    数据:
       yp fy yblx dj sl je
       1  1  1     1 1  1
       1  2  1     1 1 1
       1  1 2     1 1 1
       2  1  1     1 1  1
       2  2  1     1 1 1
       1  1 2     1 1 1
    我要实现的效果:
    药品 药品合计 3 3 3
    西药 1   1 1
    甲类 xxx xxx xx
    乙类 xxx xxx xx
    丙类 xxx xxx xx
    诊疗 诊疗合计 3 3 3
    检查费 1   1 1
    甲类 xxx xxx xx
    乙类 xxx xxx xx
    丙类 xxx xxx xx
      

  2.   

    ---测试数据---
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([yp] int,[fy] int,[yblx] int,[dj] int,[sl] int,[je] int)
    insert [tb]
    select 1,1,1,1,1,1 union all
    select 1,2,1,1,1,1 union all
    select 1,1,2,1,1,1 union all
    select 2,1,1,1,1,1 union all
    select 2,2,1,1,1,1 union all
    select 1,1,2,1,1,1
     
    ---查询---
    select case when px!=1 then '' else 类型 end as 类型,项目,单价,数量,金额
    from(
    select 
      px=row_number() over(partition by yp order by 
      case when yp is null then 1 else 2 end,
      yp,
      case when fy is null then 1 else 2 end,
      fy,
      case when yblx is null then 1 else 2 end),
      类型=yp,
      项目=isnull(isnull(cast(yblx as varchar(10)),fy),yp+'合计'),
      单价=sum(dj),
      数量=sum(sl),
      金额=sum(je)
    from(
    select
      yp=case yp when 1 then '药品' when 2 then '诊疗' end,
      fy=case fy when 1 then '西药' when 2 then '中药品' when 3 then '材料等' end,
      yblx= case yblx when 1 then '甲类' when 2 then '乙类' when 3 then '丙类' end,
      dj,sl,je
    from tb
    ) t group by yp,fy,yblx with rollup
    )t2
    where 类型 is not null
    ---结果---
    /**
    类型   项目         单价          数量          金额
    ---- ---------- ----------- ----------- -----------
    药品   药品合计     4           4           4
           西药         3           3           3
           甲类         1           1           1
           乙类         2           2           2
           中药品       1           1           1
           甲类         1           1           1
    诊疗   诊疗合计     2           2           2
           西药         1           1           1
           甲类         1           1           1
           中药品       1           1           1
           甲类         1           1           1(11 行受影响)
    **/