求SQL语句,在线等待!

weishili 2003-03-01 04:24:08
某类物品有若干种(种类不定),均分为1-3三个等级(分级是固定的),每条记录显示的信息为:某个级别的某种物品数量,表结构如下:

NAME(物品种类) CLASS(等级) NUMBER(数量)
A 1 4
A 2 3
A 3 1
A 3 2
A 3 1
B 1 2
B 1 3
B 2 1
B 2 3
C 1 4
C 1 2
C 3 1
... ... ...

问题:统计出各种物品在1、2、3各级别的总数,要求查询的结果如下列格式所示:
NAME 1级 2级 3级 总计
A 4 3 4 11
B 5 4 0 9
C 6 0 1 7
...

在线等待各位高手的解答,先谢过!
...全文
61 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
beckhambobo 2003-03-02
  • 打赏
  • 举报
回复
若是记录频繁,那最不用语句了,用临时间表实现比较适合.

CREATE GLOBAL TEMPORARY TABLE TABLENAME (
NAME varchar2(20),
one number,
two number,
three number,
........,
total number
) ON COMMIT PRESERVE(DELETE) ROWS ;
/

create or replace procedure name_pro
as
v_one number;
v_two number;
v_three number;
v_four number;
.....
v_total number;
cursor t1_sor is
select distinct name from table_name;
cursor t2_sor(p_name varchar2) is
select sum(number) num from table_name where name=p_name group by class;
begin
delete from TABLENAME;
for v1_sor in t1_sor loop
for v2_sor in t2_sor(v1_sor.name) loop
v_one:=v2_sor.class;
v_two:=v2_sor.class;
v_three:=v2_sor.class;
v_four:=v2_sor.class;
.....
end loop;
v_total:=v_one+v_two+v_three+v_four;
insert into TABLENAME values(v1_sor.name,v_one,v_two,v_three,v_four,...,v_total);
end loop;
end;
/

还没测试.
weishili 2003-03-01
  • 打赏
  • 举报
回复
非常感谢klyh(风笛)和beckhambobo(beckham)的回答,用beckhambobo(beckham)所提供的方法已达到了我的要求,我还想请教一下beckhambobo(beckham)前辈.
我上面所列的表是一张在产品表,记录更新很频繁.上面所做的操作实际上是在产品的查询,而不是定期的统计,要求随时能查出上面所示的统计结果.针对这种情况,是用存储过程还是用您所提供的SQL语句来实现更有效?
请赐教! 谢谢!
beckhambobo 2003-03-01
  • 打赏
  • 举报
回复
管理->填写密码,分配分数->结贴->填写主要解答人->提交
weishili 2003-03-01
  • 打赏
  • 举报
回复
非常感谢各位的解答,我再试试,还希望各位继续给出高见!我会尽快结贴给分的!分不够的话,另外发贴赠分!
beckhambobo 2003-03-01
  • 打赏
  • 举报
回复
select name,sum(decode(CLASS,1,NUMBER,0)) 1级,
sum(decode(clsss,2,number,0)) 2级,
sum(decode(clsss,3,number,0)) 3级,
sum(decode(clsss,4,number,0)) 4级,
.................................,
sum(NUMBER)
from table_name group by name;

此语句性能极差,提仪用过程实现.
klyh 2003-03-01
  • 打赏
  • 举报
回复
上面的游标有问题:
cursor c1 is select distinct NAME(物品种类)from table1;
klyh 2003-03-01
  • 打赏
  • 举报
回复
你如果直接用SQL语句来完成,好象不可能!
这样吧,你试试下面的方式:

一、你新建一个表table2来存储统计的结果,字段分别为:NAME 1级 2级 3级 总计;

二、然后编写一个存储过程,来进行统计
create or replace procedure tongji
is
//定义程序中用到的参数变量
v_name varchar2(20);
1级 number(2);
2级 number(2);
3级 number(2);
cursor c1 is select NAME(物品种类)from table1;
begin
open c1;
loop
FETCH c1 INTO v_name;
exit when c1%notfound;
select count(*) into 1级 from table1 where CLASS='1' and NAME=v_name;
select count(*) into 2级 from table1 where CLASS='2' and NAME=v_name;
select count(*) into 3级 from table1 where CLASS='3' and NAME=v_name;
insert into table2(统计表) values (v_name,1级,2级,3级,1级+2级+3级);
commit;
end loop;
close c1;
end;
JasLi 2003-03-01
  • 打赏
  • 举报
回复
select distinct name, class, sum(number) from tablename group by name, class

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧