手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Mssql>列表

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

来源:互联网 作者:west263.com 时间:2008-04-02
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

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


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!