求一个递归函数的写法?

barljy 2008-01-28 02:51:21
表A的数据模拟如下:
FLevel FAmount
1 1200
1 0
2 125
2 0
3 1250
3 625
2 126
FLevel表示的是层次关系,我现在要对这个表进行处理,处理后的结果为:
FLevel FAmount
1 1200
1 2125
2 125
2 1875
3 1250
3 625
2 125
存储过程已写好,只需要再写个递归函数供调用即可,请问这样的递归函数该怎么写?
...全文
137 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
barljy 2008-01-28
  • 打赏
  • 举报
回复
那我再说详细点吧(数据其实是从物料清单表中抽象出来的)
flevel FItemNumber famount
1 A 0
2 A1 125
2 A2 0
3 A21 1250
3 A22 625
2 A3 125
1 B 0
2 B1 0
3 B11 125
3 B12 125
2 B2 625
flevel表示此物料所处的级数,FItemNumber表示物料代码,famount表示此物料所消耗的成本金额
这个表的意思是此成品是由A和B两种物料组成,而A和B是半成品,A又是由A1,A2,A3组成,那A的成本是不是A1,A2,A3各自的成本之和,而A2又是由A21,A22组成,famount(A2)=famount(A21)+famount(A22),而B又牵涉到另外一组成本组成啊,就是这样的模型啊。所以牵涉到递归啊
要得到famount(A),必须先得到famount(A1),famount(A2)和famount(A3),可famount(A2)又famount(A21)+famount(A22)之和。
另外,这里举例是3层关系,实际层数可能更多
这下理解清楚了吗?
pt1314917 2008-01-28
  • 打赏
  • 举报
回复
.......
被你说糊涂了。
你那规律不是父级的famount等于子集的famount的和么?
你后面贴的那数据是什么规律来的?
被你搞昏了。。
barljy 2008-01-28
  • 打赏
  • 举报
回复
test
barljy 2008-01-28
  • 打赏
  • 举报
回复
结果应该是这样的:
flevel famount
1 2125
2 125
2 1875
3 1250
3 625
2 125
1 875
2 250
3 125
3 125
2 625
你那结果明显错了嘛,还看不出来嘛
FLevel=1表示第一级,每个FLevel=1表示新的开始啊
pt1314917 2008-01-28
  • 打赏
  • 举报
回复

what?
barljy 2008-01-28
  • 打赏
  • 举报
回复
test
pt1314917 2008-01-28
  • 打赏
  • 举报
回复



create table tes(flevel int,famount int)
insert into tes select 1,1200
insert into tes select 1,0
insert into tes select 2,125
insert into tes select 2,0
insert into tes select 3,1250
insert into tes select 3,625
insert into tes select 2,125
insert into tes select 1,0
insert into tes select 2,0
insert into tes select 3,125
insert into tes select 3,125
insert into tes select 2,625


select flevel,case famount when 0 then
(select sum(famount) from tes where flevel>=a.flevel+1) else famount end [famount]
from tes a

--结果:
flevel famount
1 3000
2 125
2 2125
3 1250
3 625
2 125
1 3000
2 2125
3 125
3 125
2 625

按照我理解的是对的。楼主。哪不对了呢?
barljy 2008-01-28
  • 打赏
  • 举报
回复
楼上的方法试了下,可以实现
不过还要改进,因为我给的数据只是一部分。
FLevel FAmount FInterID
1 1200 1
1 0 2
2 125 3
2 0 4
3 1250 5
3 625 6
2 125 7
1 0 8
2 0 9
3 125 10
3 125 11
2 625 12
象这样的数据,你上面的写法就不对了,你帮忙再看看
pt1314917 2008-01-28
  • 打赏
  • 举报
回复

楼主那个126变成125不知道是怎么回事。看下面的语句是否可以吧。。

create table tes(flevel int,famount int)
insert into tes select 1,1200
insert into tes select 1,0
insert into tes select 2,125
insert into tes select 2,0
insert into tes select 3,1250
insert into tes select 3,625
insert into tes select 2,125



select flevel,case famount when 0 then
(select sum(famount) from tes where flevel>=a.flevel+1) else famount end [famount]
from tes a

barljy 2008-01-28
  • 打赏
  • 举报
回复
就是根据FLevel字段的值看的,1是2的上一层,2是3的上一层啊
---------------------------------------------------
这样的结构啦。晕忽忽。。。。
就是这样的结构,你们看怎么写吧?不能写吗
就是根据FLevel的值来判断,如果大于上条记录的FLevel中的值,就表示这条记录是上条记录的子项啊
pt1314917 2008-01-28
  • 打赏
  • 举报
回复
FLevel FAmount
1 1200
1 0
2 125
2 0
3 1250
3 625
2 126
FLevel表示的是层次关系,我现在要对这个表进行处理,处理后的结果为:
FLevel FAmount
1 1200
1 2125
2 125
2 1875
3 1250
3 625
2 125


--------------------------
那最后一个2的FAmount怎么由126变成了125呢?
pt1314917 2008-01-28
  • 打赏
  • 举报
回复
就是根据FLevel字段的值看的,1是2的上一层,2是3的上一层啊
---------------------------------------------------
这样的结构啦。晕忽忽。。。。
barljy 2008-01-28
  • 打赏
  • 举报
回复
就是根据FLevel字段的值看的,1是2的上一层,2是3的上一层啊
火星求索 2008-01-28
  • 打赏
  • 举报
回复
看不出来
pt1314917 2008-01-28
  • 打赏
  • 举报
回复
FLevel FAmount
1 1200
1 0
2 125
2 0
3 1250
3 625
2 126
---------------------------
你这里的数据何以看得出来父级和子级??
barljy 2008-01-28
  • 打赏
  • 举报
回复
就是父项的FAmount值等于子项的FAmount之和,第2个FLevel为2的下面2条记录的FLevel都是3,说明是他是父项,下面的2条记录是子项(当然这个子项可能又是其它子项的父项),所以把下面2条记录的FAmount加起来赋值给父项记录中的FAmount字段(1250+625=1875)。其它依次类推。明白了吗?
pt1314917 2008-01-28
  • 打赏
  • 举报
回复
怎么得到这个结果的?楼主解释下规律

34,870

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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