收藏 分销(赏)

sql迭代查询.doc

上传人:s4****5z 文档编号:8091643 上传时间:2025-02-04 格式:DOC 页数:4 大小:66KB 下载积分:10 金币
下载 相关 举报
sql迭代查询.doc_第1页
第1页 / 共4页
sql迭代查询.doc_第2页
第2页 / 共4页


点击查看更多>>
资源描述
妙用SQL Server聚合函数和子查询迭代求和 § 出处:IT专家网 日期:2010-04-26 §    § 分享到:新浪微博   先看看下面的表和其中的数据:   t_product      图1   该表有两个字段:xh和price, 其中xh是主索引字段,现在要得到如下的查询结果:      图2   从上面的查询结果可以看出,totalprice字段值的规则是从第1条记录到当前记录的price之和。如第3条记录的totalprice字段的值是10 + 25 + 36 = 71。   现在要通过t_product表中的数据生成图2所示的查询结果。可能会有很多读者想到使用循环和游标,不过这种方式效率并不高,尤其在记录非常多的情况。   从图2的查询结果分析可知,这个结果仍然是求和的操作,只是并不是对所有的记录求和,也不是分组求和,而是使用迭代的方式进行求和,求和的公式如下:   当前记录的totalprice值 = 当前记录的price值 + 上一条记录的totalprice值   上一条记录的totalprice值也可看成是当前记录以前所有记录的price值之和。因此,可以对每一条记录进行求和(使用sum函数),不过要求出当前记录及以前的记录的price之和,如下面的SQL语句:   select a.xh, a.price,   (select sum(price) from t_product b where b.xh <= a.xh) as totalprice   from t_product a 先看看下面的表和其中的数据:   t_product      图1   该表有两个字段:xh和price, 其中xh是主索引字段,现在要得到如下的查询结果:      图2   从上面的查询结果可以看出,totalprice字段值的规则是从第1条记录到当前记录的price之和。如第3条记录的totalprice字段的值是10 + 25 + 36 = 71。   现在要通过t_product表中的数据生成图2所示的查询结果。可能会有很多读者想到使用循环和游标,不过这种方式效率并不高,尤其在记录非常多的情况。   从图2的查询结果分析可知,这个结果仍然是求和的操作,只是并不是对所有的记录求和,也不是分组求和,而是使用迭代的方式进行求和,求和的公式如下:   当前记录的totalprice值 = 当前记录的price值 + 上一条记录的totalprice值   上一条记录的totalprice值也可看成是当前记录以前所有记录的price值之和。因此,可以对每一条记录进行求和(使用sum函数),不过要求出当前记录及以前的记录的price之和,如下面的SQL语句:   select a.xh, a.price,   (select sum(price) from t_product b where b.xh <= a.xh) as totalprice   from t_product a 最外面一层当然就是整个select语句了。   在执行上面的SQL后,将会得到和图3一样的查询结果了。   如果读者不喜欢写太长的SQL,可以将部分内容写到函数里,代码如下:   create function mysum(@xh int, @price int) returns int   begin   return (select   (case when totalprice is null then @price else totalprice end) as totalprice   from ( select sum(price) as totalprice from t_product where xh < @xh) x)   end   可使用下面的SQL语句来使用这个函数:   select xh, price, dbo.mysum(xh, price) as totalprice   from t_product 在执行上面的SQL后,将得出如图3所示的查询结果。   建立t_product表的SQL语句(SQL Server 2005)如下:   SET ANSI_NULLS ON   GO   SET QUOTED_IDENTIFIER ON   GO   IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[t_product]') AND type in (N'U'))   BEGIN   CREATE TABLE [dbo].[t_product](   [xh] [int] NOT NULL,   [price] [int] NOT NULL,   CONSTRAINT [PK_t_product] PRIMARY KEY CLUSTERED   (   [xh] ASC   )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]   ) ON [PRIMARY]   END
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服