现在一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 数量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也就是大中小三个一组,然后显示一个总计,跟着显示,这样界面才好编码,最后显示全部人总计.谢谢!!
from
(
select 品号,标号,类型,sum(数量1) 数量1,sum(数量2) 数量2
from tb
group by rollup(品号,标号,类型)
)
order by 品号,标号,类型
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应该是所有品号、标号值中最大的,这样总计才能排到最后。
from
(
select 品号,标号,类型,sum(数量1) 数量1,sum(数量2) 数量2
from table_name
group by rollup (品号,标号,类型)
order by 品号,标号,类型
)
数量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
效率问题不是孤立的数据库效率或者代码的效率,而是系统性的问题。
1.楼主并没有要求对每种品号再汇总一行,使用rollup肯定会多出一组这样的汇总行
2.版本较低的oracle不支持rollup特性(我目前用的7.3版的就不支持)
再说一下效率问题
我说的是对我前面提供的语句说的,如果不能用rollup,就只能对表进行3次扫描,而且不能使用索引,效率要比只使用一次低2倍。如果表大的话这是难以忍受的,而放到前台,前台只会对选出的数据计算,类似于rollup对语句所做的优化,当然至于使用rollup会比使用3次扫描快好多,比1次扫描稍慢点的话最好还是使用它,毕竟这是系统提供的东东。
但得到数据的组织形式会和你期望的有差别,但你期望得到的数据都会在里面。