这样的SQL应该如何写?可以用一条SQL解决吗? ( 积分: 200 )

  • 主题发起人 主题发起人 float8
  • 开始时间 开始时间
F

float8

Unregistered / Unconfirmed
GUEST, unregistred user!
表1
时间 金额
1 5
1 -3
2 4
2 -6
3 2
如何得到 表2
时间 金额 结余
1 5 5
1 -3 2
2 4 6
2 -6 0
3 2 2

谢谢!
 
大哥,请问你的结余从何而来,请讲详细点,要不然我们没法帮你。
 
从上到下算的,应该能看出来
 
一条sql语句应该不可以。你使用临时表,用代码进行计算后再显示吧。
 
没看明白 你想表达什么
 
真的不想用临时表啊
 
上一条和下一条值的计算问题
 
你应该再加一个ID字段,如
ID 时间 金额
1 1 5
2 1 -3
3 2 4
4 2 -6
5 3 2
-------------------
这样就变成:
SELECT dtime, vamt, ISNULL
((SELECT SUM(vamt)
FROM bala
WHERE id < b.id), 0) + vamt AS vbal
FROM Bala b
 
有一个实现方法:
选用存储过程,在其中运用临时表,在存储过程结尾处,输出临时表记录即可!
 
这是一个查询结果,如何加ID呢?
 
ACCESS中用临时表很头痛的
 
按理来说,只要有时间就可以了,但你的时间会重复,这就不能做为唯一键值一使用了。
如果你的时间绝不重复的话,自己改一下就是了吧:
时间 金额
1:01 5
1:02 -3
2:47 4
2:50 -6
3:03 2
-------------------
这样就变成:
SELECT dtime, vamt, ISNULL
((SELECT SUM(vamt)
FROM bala
WHERE dtime < b.dtime), 0) + vamt AS vbal
FROM Bala b
 
根据表看起来,楼主的情况好像是现金收银流程:用户付款,然后立即找零。同一时间,
一正一负。如果真的是这样——每个时间必然有且仅有一条正记录、至多一条负记录,那
么:

在Kisber兄的基础上改进:
SELECT 时间, 金额,
(SELECT SUM(金额)
FROM 表1
WHERE 时间 < b.时间 OR
(时间 = b.时间 AND 金额 >= b.金额)) AS vbal
FROM 表1 b
ORDER BY 时间, 金额 DESC

测试结果:
2007-1-1 5 5
2007-1-1 -3 2
2007-1-2 4 6
2007-1-2 -6 0
2007-1-3 2 2
 
实际情况不是creation-zy老兄想象的那样,正负或重复都有可能。

Kisber老兄所讲的加ID应该是个好想法,但我想不出实现的方法。
如果有好的办法实现,另开贴加200分:-)
 
用当前记录号的办法可以吗?该如何写呢?
 
要看你的是什么数据库
如果是Oracle,那用它的分析函数很简单就搞定了。
 
ACCESS数据库

看来山穷水尽疑无路
 
那就比较麻烦了。
如果你是在Dephi中写程序,用程序实现应该更方便,非要在SQL完成吗?
 
有不用中间表的解决办法吗?
 
如果是一正一负 还有的解,表名 E
t a
1 5
1 -3
2 4
2 -6
3 2

SELECT d.t, d.a,
IsNull((SELECT SUM(f.a)
FROM (select t, A, (case WHEN (A>0) then (t*2) else (t*2+1) end) as id from e )f
WHERE id < d.id),0) + d.a AS Amount
FROM (select t, A, (case WHEN (A>0) then (t*2) else (t*2+1) end) as id from e )d
 
后退
顶部