现在位置:中国IDC吧>数据库>SQL server数据库> 文章内容

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

收藏发布 来源:IT 专家网 作者:中国IDC吧 更新日期:2008-09-30 点击:
  日前,在浏览CSDN数据库技术论坛的时候,发现了一个帖子,帖子中的提问者要求一条SQL查询语句,但是不要存储过程 函数 游标,因为要在Access里面执行,当天就有高手回复了,并且提问者也已经调通了,帖子就此也结了。那么是不是问题真的解决了呢?

  日前,在浏览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



收藏此页到网摘/书签:
所有评论

评论列表

用户名: 新注册) 密码: 匿名评论