--1、构造测试数据 CREATE TABLE #T(n1 INT,n2 INT) INSERT INTO #T SELECT -40,5 UNION ALL SELECT -60,NULL UNION ALL SELECT -40,NULL UNION ALL SELECT -40,NULL UNION ALL SELECT -40,NULL UNION ALL SELECT -20,NULL UNION ALL SELECT -60,NULL UNION ALL SELECT -12,NULL UNION ALL SELECT 800,NULL --2、增加编号列,写入临时表 SELECT *,IDENTITY(int,1,1) AS rowid INTO #TT FROM #T --3、查询结果集 SELECT t1.rowid,SUM(t2.n1)+5 FROM #TT t1--这里的5是初始值 LEFT JOIN #TT t2 ON t2.rowid<=t1.rowid AND t2.rowid>1 GROUP BY t1.rowid --4、因为不知道关系,不知道是否有标识字段可以匹配更新
感谢
@〆 Me゛丶: 没能一行语句搞定,呵呵。
一行搞不定的,你用存储过程,
cursor
循环
或者用前台代码,for each自己算吧。
如果在代码里面倒是好实现,定义中间变量就搞定了.关键是不能用存储过程,只能用纯sql,单纯的select,和union之类
@〆 Me゛丶:
你这样提问不能解决问题的。这样的提问就象我以前说的,怎么样才能提着自己的头发离开地面。
我知道你不是一定要用一行SQL搞定,只是性能问题或者其他考虑,但是你的需求完全可以用我刚刚说的方法解决的,换个思路就行了。
通常对于不能用一行SQL解决的问题,有两种方法,一种是取出时循环计算,另一种是计算后持久化(这个方法刚刚没有提到,我估计是你可以使用的)。
@爱编程的大叔: 也许您确实知道很多,但这里是博问,也许问题对您来说不是问题,但请尊重每一个提问者,既然那么厉害 就直接解决,不是让你来指指点点的~感谢您的热心。
linq不行吗
是在BI裏面,ERP
可以解决。
假定存储供需数量的表为 t1, t1的表结构:quantity,sortno
结存初值为 V1
quantity表示供需数量,sortno为排序字段(不能重复,只能递增)
1)先定义一个sql函数Fn(s1,s2) ,Fn有两个参数,s1为排序值,s2为结存初值。Fn的返回值为:
select sum(quantity) + s2 from t1 where sortno<s1
2)一条sql语句查询出想要的结果:
select quantity,Fn(sortno,V1) from t1 order by sortno asc
这个倒是解决了,性能我就不说了。
而且这与存储过程解决没有什么两样吧。如果可以用函数的话,
用存储过程也是一样的,哈。
sqlserver的话,可以用with递归解决吧,可以设定递归的下一层某值等于上层的某值加某个值的
就是这个逻辑,可是就是不会表达 设temp什么的啊,能给个范例么 3q
@〆 Me゛丶: 等我试试来,好久没用,我得去查以前是怎么写with的
@〆 Me゛丶:
with moneycte (id, mount, total) as (select id as id, mount as mount, total = cast(5 as float) from money where id = 1 union all
select money.id, money.mount, cast ((total + money.mount) as float) from money inner join moneycte on
money.id = moneycte.id + 1)
select * from moneycte
@〆 Me゛丶: 数据库表money, 字段1 id,顺序加1,字段2 mount float
可以终结此问题了吧,给豆豆
这个 ,用ZUX的递归方法可以实现 要求SQL2005 以上的版本。
注意 默认递归100次,如果大于,请加参数。
ID可用Row_Number 生成。