现在一view,数据如下
品号 标号 类型 数量1 数量2
00   001   大   10    5
00   001   中   20    15
00   001   小   10    3
00   002   大   5     7
00   002   中   5     3
00   002   小   4     4
01   001   大   10    3
01   001   中   11    5
01   001   小   17    13显示结果想显示成下面一样.
大   10    5
中   20    15
小   10    3
总   40    23大   5     7
中   5     3
小   4     4
总   14   14大   10    3
中   11    5
小   17    13
总   38   21总计  92   58也就是大中小三个一组,然后显示一个总计,跟着显示,这样界面才好编码,最后显示全部人总计.谢谢!!

解决方案 »

  1.   

    select nvl(类型,'总') 类型,数量1,数量2
    from
    (
    select 品号,标号,类型,sum(数量1) 数量1,sum(数量2) 数量2 
    from tb
    group by rollup(品号,标号,类型)
    )
    order by 品号,标号,类型
      

  2.   

    select 品号,标号,类型,decode('类型','大',0,'中',1,'小',2) as lx,数量1,数量2 
    from yourview
    union all
    select 品号,标号,'总',3,sum(数量1),sum(数量2) from yourview
    group by 品号,标号
    union all
    select 99,999,'总计',4,sum(数量1),sum(数量2) from yourview
    order by 1,2,4
    1.如果要按品号、标号排序,排序字段就必须出现在显示列中,否则你的输出看不出是什么货了。
    2.最后一个选择语句中的99,999应该是所有品号、标号值中最大的,这样总计才能排到最后。
      

  3.   

    select 类型,数量
    from
    (
     select 品号,标号,类型,sum(数量1) 数量1,sum(数量2) 数量2
     from table_name 
     group by rollup (品号,标号,类型) 
     order by 品号,标号,类型
    )
      

  4.   

    SELECT 类型,
           数量1,
           数量2
      FROM (SELECT 品号,
                   标号,
                   CASE
                     WHEN GROUPING(品号) = 0 AND GROUPING(标号) = 0 AND GROUPING(类型) = 0 THEN
                      类型
                     WHEN GROUPING(品号) = 0 AND GROUPING(标号) = 0 AND GROUPING(类型) = 1 THEN
                      '小计'
                     WHEN GROUPING(品号) = 0 AND GROUPING(标号) = 1 AND GROUPING(类型) = 1 THEN
                      '合计'
                     ELSE
                      '总计'
                   END AS 类型,
                   SUM(数量1) AS 数量1,
                   SUM(数量2) AS 数量2
              FROM Product
             GROUP BY ROLLUP(品号, 标号, 类型))结果:
    大  10    5
    中  20    15
    小  10    3
    小计  40    23大  5    7
    中  5    3
    小  4    4
    小计  14  14
    合计  54  37大  10    3
    中  11    5
    小  17    13
    小计  38  21
    合计  38  21总计  92  58 
      

  5.   

    另外说下4楼,数据处理最好是放在数据库端的,尤其用的了oracle,整体的系统效率绝对比放到前台高,
    效率问题不是孤立的数据库效率或者代码的效率,而是系统性的问题。
      

  6.   

    不用rollup的理由有2:
    1.楼主并没有要求对每种品号再汇总一行,使用rollup肯定会多出一组这样的汇总行
    2.版本较低的oracle不支持rollup特性(我目前用的7.3版的就不支持)
    再说一下效率问题
    我说的是对我前面提供的语句说的,如果不能用rollup,就只能对表进行3次扫描,而且不能使用索引,效率要比只使用一次低2倍。如果表大的话这是难以忍受的,而放到前台,前台只会对选出的数据计算,类似于rollup对语句所做的优化,当然至于使用rollup会比使用3次扫描快好多,比1次扫描稍慢点的话最好还是使用它,毕竟这是系统提供的东东。
      

  7.   

    把rollup换成cube可以得到你要的汇总部分数据,你再把除数列加上就得到除数的合计,再加一列就可以得到平均值,
    但得到数据的组织形式会和你期望的有差别,但你期望得到的数据都会在里面。