一个分级汇总的问题! 0CSDN]

发布时间:2016-12-6 13:53:34 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"一个分级汇总的问题! 0CSDN]",主要涉及到一个分级汇总的问题! 0CSDN]方面的内容,对于一个分级汇总的问题! 0CSDN]感兴趣的同学可以参考一下。

大家好! 例表字段及数据例子如下: 用户名     上级用户    个人业绩     累计业绩 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 @[email protected]      if @ls_dbrbh='0'       begin         goto txts         -- CONTINUE       end       update #tmp set fdbr='|'+dbrbh where [email protected]            while 1=1        begin        set @ls_dbrbh_2=(select dbrbh from #tmp where [email protected]_dbrbh)         if @ls_dbrbh_2='0'            begin              update #tmp set fdbr=fdbr+'|' where [email protected]              break            end             update #tmp set [email protected]_dbrbh_2 where [email protected]            set @[email protected]_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

上面还没写完 下面跟上面存储过程 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 @[email protected]      set @[email protected]_dbrbh+'|'      set @je=(select isnull(sum(gryj),0) from #tmp where dbrbh like [email protected]_dbrbh+'%' )      update #tmp set [email protected] where [email protected] end GO

我觉得你在表上加两个触发器比较好,一个INSERT,一个UPDATE,调用递归触发器 我实现过。

catecount表结构id (int),fid(int,父ID),num(int),tnum(int,统计列) create procedure testReback as declare @id int,@fid int declare @num int,@tnum int declare t_cur cursor for select * from catecount open t_cur fetch next from t_cur into @id,@fid,@num,@tnum while @@fetch_status=0 begin     while @fid!=0--(select fid!=0 from catecount where [email protected]) begin update catecount set [email protected] where [id][email protected] set @[email protected] select @fid=fid from catecount where [id][email protected] end fetch next from t_cur into @id,@fid,@num,@tnum end

上一篇:怎么写这种SQL语句 0CSDN]
下一篇:内存数据库,熟悉的请进 100jlbnet]

相关文章

相关评论