问题: 各位大虾: 表: 索引 凭证编码 金额 摘要 日期 cnsy pzbm pzje cnzy cnrq 1 101 100.00 2 102 100.00 3 202 200.00 4 203 100.00 得到结果 谢谢! 不要存储过程+函数+游标,因为要在Access里面执行 |
网友libin_ftsafe(子陌红尘)给出的回复:
ACCESS里用这条语句: ------------------------------------------------------ select a.cnsy as 索引, a.pzbm as 凭证编码, 0 as 期出余额, a.pzje as 金额, a.pzje as 期末金额, a.cnzy as 摘要 from t a where not exists(select 1 from t where cnsy<a.cnsy) union all select a.cnsy as 索引, a.pzbm as 凭证编码, sum(b.pzje) as 期出余额, a.pzje as 金额, sum(b.pzje)+a.pzje as 期末金额, a.cnzy as 摘要 from t a,t b where a.cnsy>b.cnsy group by a.cnsy,a.pzbm,a.pzje,a.cnzy |
一道问题就词是否真的结束了呢?随后提问者在使用的过程中发现了一个新问题:当删除中间日期的时候,再插入新的旧日期数据,按照日期排序,数值就不正确了!原因是提问者的需求中,排序以日期时间为准,不已索引为准,因为当某个凭证作废后,重新生成的数据就排到后面去了,这样计算出的期初数就不正确了!所以,有时候我们很多的问题看似第一时间解决了,但解决方法只针对这件事有效,而缺乏对通用算法和语句的提炼和总结。将需求的共性总结融汇到解决方案中去,形成“案例”,这也是数据库从业人员必不可少的一项技能。
以下是网友libin_ftsafe(子陌红尘)根据提问者发现的问题重新写出的语句。这个问题是否到此结束了呢?我想,还远没结束呢!
select a.cnsy as 索引, a.pzbm as 凭证编码, 0 as 期出余额, a.pzje as 金额, a.pzje as 期末金额, a.cnzy as 摘要 from t a where not exists(select 1 from t where cnrq<a.cnrq) and not exists(select 1 from t where cnrq=a.cnrq and cnsy<a.cnsy) union all select a.cnsy as 索引, a.pzbm as 凭证编码, sum(b.pzje) as 期出余额, a.pzje as 金额, sum(b.pzje)+a.pzje as 期末金额, a.cnzy as 摘要 from t a,t b where a.cnrq>b.cnrq or (a.cnrq=b.cnrq and a.cnsy>b.cnsy) group by a.cnsy,a.pzbm,a.pzje,a.cnzy |