首页新闻找找看学习计划

需要实现SQL中的累计加减

0
悬赏园豆:80 [已解决问题] 解决于 2014-03-05 08:08

  首先申明:不要百度上那些银行存贷款的,那和我实际需求不一样!(这是在BI里面实现的,然后因为此项目的特殊性只能用纯SQL,存储过程都不行,大家见谅,帮帮忙^.^)

如图:供需数量ds_qty,预计结存qly,两栏位数据都需动态查询得到,现在已知供需数量资料行数据,我想得到所有预计结存的资料数据,通过图片可以了解它们的逻辑已经很清晰了,希望园友帮忙,能实现此需求的SQL.谢谢~

问题补充:

假设 供需数量和预计结存的第一资料行已知,只需通过此逻辑计算出从第二行开始的数据~

小熊QQ糖的主页 小熊QQ糖 | 初学一级 | 园豆:152
提问于:2014-03-04 10:31
< >
分享
最佳答案
0
--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、因为不知道关系,不知道是否有标识字段可以匹配更新
收获园豆:20
幻天芒 | 高人七级 |园豆:36544 | 2014-03-04 14:00

感谢

小熊QQ糖 | 园豆:152 (初学一级) | 2014-03-04 15:01

@〆 Me゛丶: 没能一行语句搞定,呵呵。

幻天芒 | 园豆:36544 (高人七级) | 2014-03-04 15:19
其他回答(5)
0

一行搞不定的,你用存储过程,

cursor

循环

或者用前台代码,for each自己算吧。

收获园豆:10
爱编程的大叔 | 园豆:30089 (高人七级) | 2014-03-04 10:38

如果在代码里面倒是好实现,定义中间变量就搞定了.关键是不能用存储过程,只能用纯sql,单纯的select,和union之类

支持(0) 反对(0) 小熊QQ糖 | 园豆:152 (初学一级) | 2014-03-04 10:39

@〆 Me゛丶: 

你这样提问不能解决问题的。这样的提问就象我以前说的,怎么样才能提着自己的头发离开地面。

我知道你不是一定要用一行SQL搞定,只是性能问题或者其他考虑,但是你的需求完全可以用我刚刚说的方法解决的,换个思路就行了。

通常对于不能用一行SQL解决的问题,有两种方法,一种是取出时循环计算,另一种是计算后持久化(这个方法刚刚没有提到,我估计是你可以使用的)。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30089 (高人七级) | 2014-03-04 10:44

@爱编程的大叔: 也许您确实知道很多,但这里是博问,也许问题对您来说不是问题,但请尊重每一个提问者,既然那么厉害 就直接解决,不是让你来指指点点的~感谢您的热心。

支持(0) 反对(0) 小熊QQ糖 | 园豆:152 (初学一级) | 2014-03-04 15:31
0

linq不行吗

丫的 | 园豆:1575 (小虾三级) | 2014-03-04 11:24

是在BI裏面,ERP

支持(0) 反对(0) 小熊QQ糖 | 园豆:152 (初学一级) | 2014-03-04 11:29
0

可以解决。

假定存储供需数量的表为 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 

收获园豆:20
白毛 | 园豆:222 (菜鸟二级) | 2014-03-04 13:28

这个倒是解决了,性能我就不说了。

而且这与存储过程解决没有什么两样吧。如果可以用函数的话,

用存储过程也是一样的,哈。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30089 (高人七级) | 2014-03-04 13:30
0

sqlserver的话,可以用with递归解决吧,可以设定递归的下一层某值等于上层的某值加某个值的

收获园豆:15
Zux | 园豆:495 (菜鸟二级) | 2014-03-04 17:00

就是这个逻辑,可是就是不会表达 设temp什么的啊,能给个范例么 3q

支持(0) 反对(0) 小熊QQ糖 | 园豆:152 (初学一级) | 2014-03-04 17:02

@〆 Me゛丶: 等我试试来,好久没用,我得去查以前是怎么写with的

支持(0) 反对(0) Zux | 园豆:495 (菜鸟二级) | 2014-03-04 17:05

@〆 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 

支持(0) 反对(0) Zux | 园豆:495 (菜鸟二级) | 2014-03-04 17:19

@〆 Me゛丶: 数据库表money, 字段1 id,顺序加1,字段2 mount float

支持(0) 反对(0) Zux | 园豆:495 (菜鸟二级) | 2014-03-04 17:22

可以终结此问题了吧,给豆豆

支持(0) 反对(0) Zux | 园豆:495 (菜鸟二级) | 2014-03-04 17:30
0

这个 ,用ZUX的递归方法可以实现  要求SQL2005 以上的版本。

注意 默认递归100次,如果大于,请加参数。

ID可用Row_Number 生成。

 

收获园豆:15
Shannon | 园豆:601 (小虾三级) | 2014-03-04 18:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册