服务器 频道

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

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

问题:
各位大虾:
表:
索引  凭证编码  金额   摘要  日期
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

0
相关文章