带判断的递归调用

virgo2008 2009-07-22 12:42:36
kpi_id banben_id zbgs biaoti zhouqi mark
53 01 246 相除 LAST_YEAR Null -----1
177 0101 248 相减 LAST_YEAR NULL -----2
179 010101 269 输入 LAST_YEAR 10 -----3
180 010102 269 输入 LAST_YEAR 5 -----3
178 0102 269 输入 LAST_YEAR 2 -----2

现在我想通过C#代码或者是Sql纯如的函数,存储过程==都行,下面我开始写实现的要求了

1.表中标示的 “----1” 是不需要查询的,也就是说是传入的参数
2.根据1中传入的biaoti 参数来判断他的下级怎么运算,
比如说1中的标题为相除,就表示他的下级相除的结果为他的结果
而1的下级中banben_id 为0101的他的标题是想减,就表示他的结果是下级想减的结果,最终的算式应该是

最终结果 = (10 - 5)/ 2 得到2.5

其中标题为输入(269)的就有mark值,不为输入(!=269)的就没有mark值,他的值是根据他的biaoti类型,让下级执行所得到的结果!

不知道我的描述是不是到位,如果不到位的可以提下,我会在进行解释的!
...全文
201 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
virgo2008 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 tylike 的回复:]
呵呵,突然又想到了一个,
如果你只是为单纯计算的话,直接用DataTable的表达式列就行了。
连表都不用建了。
[/Quote]
呵呵,我用的是先将数据全部读取出来按照层级关系重新排列成可以分隔的字符串,然后循环这个字符串进行运行,终于弄出来了!哎!
都是麻烦的事情,随让公司这么要求呢!
virgo2008 2009-07-22
  • 打赏
  • 举报
回复
还没有人回我吗?
tylike 2009-07-22
  • 打赏
  • 举报
回复
呵呵,突然又想到了一个,
如果你只是为单纯计算的话,直接用DataTable的表达式列就行了。
连表都不用建了。
tylike 2009-07-22
  • 打赏
  • 举报
回复
另外说一句,你的表达式不用这么复杂的存法也一样可以算出来,假设这样:
表名:t_Item
字段:
ItemName,这里通常可以认为将来他是一个变量名
ItemValue,这里可以是由用户输入的,或是固定的,可以定义一个格式,在运行时,如果是输入的就输入。
另外,要计算这些东东,需要用公式,比如
(A+B*C/2)这是一个字符串就行了,
需要了A,B,C都是来自于表t_Item的
然后使用pivot语句将那些坚着存的东东都横过来,并使用ItemName做字段名。
再然后,使用Select 你的公式 from (pivot的结果)就算出来了。
不用递归了。
当然,前提是我说的这些你能接受,并且,可以满足你的需求的情况下。
jasondct 2009-07-22
  • 打赏
  • 举报
回复
mark
tylike 2009-07-22
  • 打赏
  • 举报
回复
如果我没理解错的话,你就是要把表达式用数据库存起来。
但你的结构还是挺让人费解的。
这种四则混合运算的表达式,可以用二叉树的格式来存,一条记录这样好些:

1,左子树ID或表达式,
2,操作符,
3,右子树ID或表达式,
4,你的其他的什么说标题或说明字段之类的....

SQL中调用递归的话,你可照这个来做:
http://www.diybl.com/course/7_databases/sql/sqlServer/20071019/78190.html

当然,你可以不改结构,还是那话句,看起来有点费解.呵呵


virgo2008 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wdgphc 的回复:]
终于看明白了。但不知道你的数据存在哪?(SQL还是一个2维数组)是不是最后只需要一个结果?
[/Quote]

你人还在不?
virgo2008 2009-07-22
  • 打赏
  • 举报
回复
我只需要一个结果,用一个字符串存储就可以了!不用数据库和数组的!
wdgphc 2009-07-22
  • 打赏
  • 举报
回复
终于看明白了。但不知道你的数据存在哪?(SQL还是一个2维数组)是不是最后只需要一个结果?
红街咖啡 2009-07-22
  • 打赏
  • 举报
回复
顶一下。
virgo2008 2009-07-22
  • 打赏
  • 举报
回复
估计沉了。。。还是自己动手写吧!
virgo2008 2009-07-22
  • 打赏
  • 举报
回复
kpi_id banben_id zbgs biaoti zhouqi mark
53 01 246 相除 LAST_YEAR Null -----1
177 0101 248 相减 LAST_YEAR NULL -----2
179 010101 269 输入 LAST_YEAR 10 -----3
180 010102 269 输入 LAST_YEAR 5 -----3
178 0102 269 输入 LAST_YEAR 2 -----2


mark是计算出来的分,后面我标注的1,2,3的只为了我方便说明!
virgo2008 2009-07-22
  • 打赏
  • 举报
回复
汇总
相乘
相除
相加
相减
输入

mark 是我用函数生成的数据,你可以看做是存在的,不用考虑函数调用的事情!
十八道胡同 2009-07-22
  • 打赏
  • 举报
回复
用到的只有 biaoti mark ?
biaoti都有那几种?
十八道胡同 2009-07-22
  • 打赏
  • 举报
回复
kpi_id banben_id zbgs biaoti zhouqi mark
53 01 246 相除 LAST_YEAR Null -----1
177 0101 248 相减 LAST_YEAR NULL -----2
179 010101 269 输入 LAST_YEAR 10 -----3
180 010102 269 输入 LAST_YEAR 5 -----3
178 0102 269 输入 LAST_YEAR 2 -----2

mark=1 的biaoti是相除(是对mark=2来说的),
其中一个mark=2是相减(是对mark=3的来说的)
是这个意思?
virgo2008 2009-07-22
  • 打赏
  • 举报
回复
需求就是根据上一级的biaoti也就是算法,来让下级执行对应的算法!
刚才说了,传入的参数1中biaoti为相除 就是说他的下级
表中为2的两个mark相除,而其中一条为2的数据的mark值是他下级相减得到的值
所以最后的运算结果应该是(10 - 5)/ 2 得到2.5
MasDn 2009-07-22
  • 打赏
  • 举报
回复
我崩溃 描述和不清楚

直接给分给我吧

建议你在c#中递归来实现
LQknife 2009-07-22
  • 打赏
  • 举报
回复
最终结果 = (10 - 5)/ 2 得到2.5
按你描述的意思一改是 最终结果 = 10 - 5 - 2 得到3才对啊
tylike 2009-07-22
  • 打赏
  • 举报
回复
不如你直接说说要实现什么需求,说不定有更简单的设计呢,呵呵
yeaicc 2009-07-22
  • 打赏
  • 举报
回复









Update

110,524

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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