一个典型面试题--写一存储过程,请高手帮忙!!谢了

ojahe 2004-09-30 04:51:15
有如下销售记录表SELLTABLE:

LOCAL PRODUCTS NUMBER
北京 A 10
北京 B 12
北京 D 123
上海 A 257
上海 C 142
天津 D 214
北京 A 20
北京 B 20
北京 D 123
上海 A 76969
上海 C 2536
.... .... .....
请写一个存储过程,将其变成如下的统计表REPORTTABLE:

LOCAL A B C D .........
北京 30 32 0 246 ...
上海 .. .. .. .. ..
天津 ... .. .. .. ..
..... .. .. .. .. ..


...全文
432 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
chendzcs 2004-10-07
  • 打赏
  • 举报
回复
Create Or Replace Procedure selltable2reporttable As
temps Varchar2(1024);
fieldval tablename.products%Type;
Begin
temps := 'Create table REPORTTABLE As select Local ';
For c In (Select Distinct products prd From tablename) Loop
fieldval := c.prd;
temps := temps + ',sum(decode(Products,''' +
fieldval + ''',NUMBER,0)';
End Loop;
temps := temps + ' from SELLTABLE group by Local';
Execute Immediate temps;
End;
/
maohuijian 2004-10-06
  • 打赏
  • 举报
回复
呵呵 用decode 或者是case when then ... end case
nbnasom 2004-10-06
  • 打赏
  • 举报
回复
declare
cursor qa is
select distinct PRODUCTS from SELLTABLE;
cursor qb is
select distinct local from SELLTABLE;
ls varchar2(4000);
LS_LOCAL varchar2(4000);
N NUMBER;
begin
ls := 'local';
for tqa in qa loop
ls := ls ||chr(9)||tqa.PRODUCTS ; --TAB键的ASC码,具体可查一下
END LOOP;
DBMS_OUT.PUTLINE(LS);
FOR TQB IN QB LOOP
LS:= TQB.LOCAL;
LS_LOCAL = LS;
for tqC in qa loop
SELECT SUM(NUMBER) INTO N FROM SELLTABLE WHERE PRIDUCTS=TQC.PRODUCTS AND LOCAL= LS_LOCAL;
LS :=LS ||chr(9)|| N;
END LOOP;
DBMS_OUT.PUTLINE(LS);
END LOOP;

END ;
/
若PRODUCTS 比较多导致LS长度超过255,可稍作改动先写表
execute immediate ("crteate table ");
或用create global temparory table;
xdd1125 2004-10-06
  • 打赏
  • 举报
回复
up
ojahe 2004-10-06
  • 打赏
  • 举报
回复
TO codoxo() :

怎么有编译错误呢?请帮帮忙看看
chendzcs 2004-10-05
  • 打赏
  • 举报
回复
回头再看,之前写的有些笔误,纠正如下:
Create Or Replace Procedure selltable2reporttable As
temps Varchar2(1024);
fieldval tablename.products%Type;
Begin
temps := 'Create table REPORTTABLE As select Local ';
For c In (Select Distinct products prd From tablename) Loop
fieldval := c.prd temps := temps + ',sum(decode(Products,''' +
fieldval + ''',NUMBER,0)';
End Loop;
temps := temps + ' from SELLTABLE group by Local';
Execute Immediate temps;
End;
/
jackyhe_oracle 2004-10-05
  • 打赏
  • 举报
回复
Oracle中也有类似exec的函数,什么名字忘了,有谁知道说一声
xdd1125 2004-10-04
  • 打赏
  • 举报
回复
这种列数不确定的交叉表,在ms sqlserver中很好实现:
declare @sql varchar(8000)
set @sql = 'select name,'
select @sql = @sql + 'sum(case subject when '''+subject+'''
then source else 0 end) as '''+subject+''','
from (select distinct subject from test) as a
select @sql = left(@sql,len(@sql)-1) + ' from test group by name'
exec(@sql)
go


但在oracle中还没试过
haifeng1012 2004-10-04
  • 打赏
  • 举报
回复
支持codoxo的写法!!
zonelive 2004-10-04
  • 打赏
  • 举报
回复
这个在SQLSERVER里面很好实现,ORACLE好象没哪个功能,来学习吧
skyyiyang 2004-10-04
  • 打赏
  • 举报
回复
select local,sum(case when produts='A' then number else 0 end ) from table group by local
union
select local,sum(case when produts='B' then number else 0 end ) from table group by local
union
select local,sum(case when produts='C' then number else 0 end ) from table group by local
幽奇 2004-10-03
  • 打赏
  • 举报
回复
学习!这个招聘方法也够有水准哦!
andzen 2004-10-01
  • 打赏
  • 举报
回复
在存储过程里面用动态SQL 可以实现任意记录的情况,不过报表基本上没有什么技术含量,只是体力和小技巧我以前就做过这样的,其实比这个更复杂要求每行只能显示4个列,最后要汇总;有需要的话回公司把代码贴上来;
dinya2003 2004-10-01
  • 打赏
  • 举报
回复
:)
哪个公司还用这种方式来招聘人?

chendzcs 2004-09-30
  • 打赏
  • 举报
回复
S:=S+',sum(decode(Products,'''+FieldVal+',NUMBER,0)';
---》
S:=S+',sum(decode(Products,'''+FieldVal+''',NUMBER,0)';
发完了才发现有笔误。
chendzcs 2004-09-30
  • 打赏
  • 举报
回复
删除:
tempI number(10);
select count(distinct PRODUCTS) into tempI from TableName;
EXECUTE IMMEDIATE V_SQL;
--》
EXECUTE IMMEDIATE tempS;
chendzcs 2004-09-30
  • 打赏
  • 举报
回复
..
tempI number(10);
tempS Varchar2(1024);
FieldVal TableName.PRODUCTS%type;
begin
select count(distinct PRODUCTS) into tempI from TableName;
tempS:='Create table NewTable As select Local';
for c in (select count(distinct PRODUCTS) PRD from TableName) loop
FieldVal:=c.PRD
S:=S+',sum(decode(Products,'''+FieldVal+',NUMBER,0)';
end loop;
S:=S+' from TableName group by Local';
EXECUTE IMMEDIATE V_SQL;

end;

写的比较乱,基本上就是这个样子
Eddie005 2004-09-30
  • 打赏
  • 举报
回复
......
bzszp 2004-09-30
  • 打赏
  • 举报
回复
用存储过程。
chendzcs 2004-09-30
  • 打赏
  • 举报
回复
select
LOCAL,
sum(decode(PRODUCTS,'A',number,0)) A,
sum(decode(PRODUCTS,'B',number,0)) B,
sum(decode(PRODUCTS,'C',number,0)) C,
....
sum(decode(PRODUCTS,'D',number,0)) Z
from TableName
group by Local;
加载更多回复(3)

17,086

社区成员

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

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