把分都给了,请教一个实例性问题!关于分级汇总的存语句

usergfc 2006-09-01 09:55:40
大家好!
例表字段及数据例子如下:
用户名 上级用户 个人业绩 累计业绩
a 0 10 0
b a 10 0
c a 10 0
d b 10 0
e d 10 0
汇总后效果
a 0 10 40
b a 10 20
c a 10 0
d b 10 10
e d 10 0
也就是本人的累计业绩等于他所有的下级用户的个人业绩合计,0表示没有上级!
请问有没有好的算法!
我写了一个存储过程,大家看看没什么错误,还没有没更简单一点的算法
//////我的思路是把每个人的上一级名子找出来放到一个字段中,然后在跟根这个字段进行过滤求合计:
CREATE PROCEDURE dgl_sumje @ls_msg varchar(50) output

AS
declare @hybh varchar (14)
declare @gryj numeric(18, 0)
declare @fwyj numeric(18, 0)
declare @dbrbh varchar(14)
declare @fdbr varchar(300)
declare @ls_dbrbh varchar(14)
declare @ls_dbrbh_2 varchar(14)
declare @je numeric(18, 0)
BEGIN TRANSACTION

CREATE TABLE #tmp (
hybh varchar (14) COLLATE Chinese_PRC_CI_AS NOT NULL ,
gryj numeric(18, 0) NULL ,
fwyj numeric(18, 0) NULL ,
dbrbh varchar(14) NULL,
fdbr varchar(300) null
)
if @@error<>0/*建立临时补助公式表失败*/
begin
select @ls_msg='建立临时失败'
ROLLBACK TRANSACTION
return
end

insert into #tmp select hybh,gryj,fwyj,dbrbh,'' from dgl_test
if @@error<>0/*向临时表插入数据失败*/
begin
select @ls_msg='向临时表插入数据失败'
ROLLBACK TRANSACTION
return
end

print 'ok'
DECLARE cur_cyxx CURSOR FOR
select hybh,gryj,fwyj,dbrbh,fdbr
from #tmp
OPEN cur_cyxx
fetch next from cur_cyxx
into @hybh,@gryj,@fwyj,@dbrbh,@fdbr
while @@Fetch_status=0
begin
print @hybh
set @ls_dbrbh=@dbrbh
if @ls_dbrbh='0'
begin
goto txts
-- CONTINUE
end
update #tmp set fdbr='|'+dbrbh where hybh=@hybh

while 1=1
begin
set @ls_dbrbh_2=(select dbrbh from #tmp where hybh=@ls_dbrbh)
if @ls_dbrbh_2='0'
begin
update #tmp set fdbr=fdbr+'|' where hybh=@hybh
break
end
update #tmp set fdbr=fdbr+'|'+@ls_dbrbh_2 where hybh=@hybh
set @ls_dbrbh=@ls_dbrbh_2
end
txts:
fetch next from cur_cyxx
into @hybh,@gryj,@fwyj,@dbrbh,@fdbr
end
close cur_cyxx
DEALLOCATE cur_cyxx
GO



上面的存储过程有几个错误的地方没找出来,请大家给看一下!
务器: 消息 512,级别 16,状态 1,过程 dgl_sumje,行 47
[Microsoft][ODBC SQL Server Driver][SQL Server]子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

@RETURN_VALUE = N/A
...全文
215 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
vovo2000 2006-09-02
  • 打赏
  • 举报
回复
这是一个树形运算的问题。
liangpei2008 2006-09-01
  • 打赏
  • 举报
回复
while 1=1
begin
select @ls_dbrbh_2=dbrbh from #tmp where hybh=@ls_dbrbh--改为这句话试一下
if @ls_dbrbh_2='0'
begin
update #tmp set fdbr=fdbr+'|' where hybh=@hybh
break
end
update #tmp set fdbr=fdbr+'|'+@ls_dbrbh_2 where hybh=@hybh
set @ls_dbrbh=@ls_dbrbh_2
end
simonhehe 2006-09-01
  • 打赏
  • 举报
回复
你的前两个字段作为双编号,可以便于你的基本工作
如果再加一个LX字段作为单编号便于你统计,是不是比你用函数递规效率高呢??
simonhehe 2006-09-01
  • 打赏
  • 举报
回复
--如果你在建表时加lX字段,不就好解决了吗?如下
--只要LX字段够长就可以了
--如果你用父子关系来确定联系,那最好有一个祖先表,不然,要是数据多了,你的方法肯定效果不理想
------------------------------------------------------
用户名 上级用户 个人业绩 累计业绩 lx
a 0 10 0 '10000'
b a 10 0 '1b000'
c a 10 0 '1c000'
d b 10 0 '1bd00'
e d 10 0 '1bde0'
usergfc 2006-09-01
  • 打赏
  • 举报
回复
上面还没写完,以下接上面

DECLARE cur_cyxx2 CURSOR
select hybh,gryj,fwyj,dbrbh,fdbr
from #tmp
OPEN cur_cyxx2
fetch next from cur_cyxx2
into @hybh,@gryj,@fwyj,@dbrbh,@fdbr
while @@Fetch_status=0
begin
set @ls_dbrbh=@dbrbh
set @ls_dbrbh='|'+@ls_dbrbh+'|'
set @je=(select isnull(sum(gryj),0) from #tmp where dbrbh like '%'+@ls_dbrbh+'%' )
update #tmp set fwyj=@je where hybh=@hybh
end
GO

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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