案例分析:看似简单的查询

2008-04-02 10:32:03来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  日前,在浏览CSDN数据库技术论坛的时候,发现了一个帖子,帖子中的提问者需要一条SQL查询语句,但是不要存储过程 函数 游标,因为要在Access里面执行,当天就有高手回复了,并且提问者也已调通了,帖子就此也结了。那么是不是问题真的解决了呢?

  原始帖子:http://community.csdn.net/Expert/topic/4613/4613168.xml?temp=.8729975

问题:
各位大虾:
表:
索引 凭证编码 金额 摘要 日期
cnsy pzbm pzje cnzy cnrq
1 101 100.00
2 102 100.00
3 202 200.00
4 203 100.00

得到结果
索引 凭证编码 期出余额 金额 期末金额 摘要
1 101 0 100.00 100.00
2 102 100.00 100.00 200.00
3 202 200.00 200.00 400.00
4 203 400.00 100.00 500.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


标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 数据库人员手边系列:SQL Server疑难排除步骤

下一篇: 日志恢复数据到时间点(总结)