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

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
...全文
211 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
内容概要:本文围绕基于风光储能和需求响应的微电网日前经济调度问题展开研究,提出了一种综合考虑风能与光伏发电不确定、储能系统充放电特及需求响应机制的优化调度模型,并提供了完整的Python代码实现。该模型旨在通过优化算法实现微电网系统运行成本最小化与能源利用效率最大化的双重目标,涵盖从数据预处理、约束条件建模到目标函数构建与求解的全过程,体现了电力系统智能管理中对可再生能源高效集成与灵活调控的核心需求。研究属于现代智能电网与综合能源系统优化领域的关键应用之一,强调了数据驱动与优化算法在提升系统经济与可靠方面的重要作用。; 适合人群:具备一定Python编程基础和电力系统基础知识,从事新能源、微电网调度、能源优化及相关领域的科研人员、研究生及工程技术人员。; 使用场景及目标:①学习微电网日前经济调度问题的建模方法与关键技术环节;②掌握如何将风光出力预测、储能动态行为与需求侧响应策略有机整合进统一的优化框架中;③通过提供的Python代码进行仿真复现实验,完成调度结果析与算法能评估,为进一步开展多目标优化、鲁棒调度或实时调度研究奠定基础。; 阅读建议:此资源以理论建模与代码实现相结合为核心,建议读者在理解调度模型数学原理的基础上,深入阅读并调试配套Python代码,关注变量定义、约束表达与求解器调用等关键实现细节,从而实现从理论认知到实践应用的有效转化。

27,580

社区成员

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

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