如何编写一个复杂SQL语句(200分)

  • 主题发起人 主题发起人 plane822
  • 开始时间 开始时间
P

plane822

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库结构
表一:
序列号,类别,数量
表二:
类别,编号,上级编号
表二内容(类别级别实行无限制增加)
类别一,01,2
类别二,02,01
类别三,03,2
要求按照各个类别来统计数量(大类下有小类)
 
好象没有表达清楚!

应该进行逐层处理。
 
用存储过程做
 
首先,出现这种情况是你的库设计不科学。其实表二没有存在的必要,这种多级分类最好
将分类编码按一定规则处理,如:顶级为A,下一级为AB,再下一级为ABC。这样级别关系
就不用再建表存储。
如果要实现分类统计,只能建存储过程,在存储过程中用临时表处理,按级别层层统计
 
没有说清楚呢,应该用存储过程做的,
 
hb_wshsh的话很有道理
我见过有人就这样设计表二, 结果在配置不正确时会引起递归死循环
 
俺导是觉得这种存储没问题呀,这个不就是bom 么,大家干吗大惊小怪。做法么最好
用存储过程了。程序中就要递归
 
存储过程到底怎么编写呢,我确实需要,可以加高分的
 
hb_wshsh, 你说的很有道理,但是顶级为A,下一级为AB,再下一级为ABC
只能创建有限的级别,再增加就不行了,总不能设成无限大
 
这样级别怎么会有限呢,如:0001->000101->00010101->0001010101国家的行政地
名不就是这样编码的吗?
呵呵
 
to hb_wshsh
比如要增加产品类别,现在不知道到底需要几级,数据库的字段长度总是要确定的吧,
但是你不知道到底该定义多长,你所说的那种情况只是先划分好以后再增加还可以
 
我认为不能讲这个数据库设计的不合理,ERP中的BOM不就这样的呢,我来帮你UP
下面是一段BOM分解的代码,你修改以下就可以实现你所须的功能了
if exists(select * from sysobjects where type='p' and name='spp_call_back')
drop proc spp_call_back
go
create proc spp_call_back @index int,@wlbh nvarchar(20),
@sl numeric(9,3),@rq datetime as
begin
declare @sql varchar(1000)
select @sql = ''
select @sql = @sql + ' declare @CurRq datetime'
select @sql = @sql + ' select @CurRq = dateadd(dd,-1,''' + convert(varchar(10),@rq,120) + ''')'
select @sql = @sql + ' declare @CurBH nvarchar(20),@CurSL numeric(9,3)'
select @sql = @sql + ' declare plan_cursor' + convert(varchar(5),@index) + ' cursor for select distinct zitemid,fzsum*' + convert(varchar(20),@sl) + ' from work_bom where fitemid='''+@wlbh+''' and fzkind=''A'''
select @sql = @sql + ' open plan_cursor' + convert(varchar(5),@index)
select @sql = @sql + ' fetch next from plan_cursor'+convert(varchar(5),@index)+' into @CurBH,@CurSL'
select @sql = @sql + ' while @@fetch_status = 0'
select @sql = @sql + ' begin'
select @sql = @sql + ' insert into #temp(f_level,f_bh,f_sl,f_rq) values(' + convert(varchar(5),@index) + ',@CurBH,@CurSL,@CurRq)'
select @sql = @sql + ' exec spp_call_back ' + convert(varchar(5),@index+1)+',@CurBH,@CurSL,@CurRq'
select @sql = @sql + ' fetch next from plan_cursor' + convert(varchar(5),@index) +' into @CurBH,@CurSL'
select @sql = @sql + ' end'
select @sql = @sql + ' close plan_cursor' + convert(varchar(5),@index)
select @sql = @sql + ' deallocate plan_cursor' + convert(varchar(5),@index)
exec(@sql)
end
go
if exists(select * from sysobjects where type='p' and name='spp_main')
drop proc spp_main
go
create proc spp_main @topbh nvarchar(20),@sl numeric(9,3),@rq datetime as
begin
create table #temp
(
f_id int IDENTITY primary key,
f_level int,
f_bh nvarchar(20),
f_sl numeric(9,3),
f_rq varchar(10),
)
exec spp_call_back 1, @topbh, @sl, @rq
select * from #temp
end;
go
spp_main 'CHACHE01',1,'2002-07-25'
 
qianwt,非常感谢你的代码,我还没试,等我改天试一下
 
接受答案了.
 
后退
顶部