`
seara
  • 浏览: 648648 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

妙用SQL Server聚合函数和子查询迭代求和

阅读更多
本文为原创,如需转载,请注明作者和出处,谢谢!

先看看下面的表和其中的数据:

t_product


1

该表有两个字段:xhprice 其中xh是主索引字段,现在要得到如下的查询结果:

图2

从上面的查询结果可以看出,totalprice字段值的规则是从第1条记录到当前记录的price之和。如第3条记录的totalprice字段的值是10 + 25 + 36 = 71

现在要通过t_product表中的数据生成图2所示的查询结果。可能会有很多读者想到使用循环和游标,不过这种方式效率并不高,尤其在记录非常多的情况。

从图2的查询结果分析可知,这个结果仍然是求和的操作,只是并不是对所有的记录求和,也不是分组求和,而是使用迭代的方式进行求和,求和的公式如下:

当前记录的totalprice = 当前记录的price + 上一条记录的totalprice

上一条记录的totalprice值也可看成是当前记录以前所有记录的price值之和。因此,可以对每一条记录进行求和(使用sum函数),不过要求出当前记录及以前的记录的price之和,如下面的SQL语句:

selecta.xh,a.price,
(
selectsum(price)fromt_productbwhereb.xh<=a.xh)astotalprice
fromt_producta

从上面的SQL语句可以看出,使用了一个子查询来求totalprice字段的值,基本原理就是根据当前记录的xh值(a.xh)来计算从当前记录往前所有记录的price值之和,b.xh表示子查询当前的xh值,在子查询中,a.xh相当于常量。上面的SQL语句的查询结果和图2完全一样。如果我们的需求是不包含当前记录的price值,也就是说,计算totalprice字段的公式如下:

当前记录的totalprice = 上一条当前记录的price + 上一条记录的totalprice

第一条记录的totalprice值就是当前记录的price值,查询t_product表的结果如图3所示。


3

要查询出上述的记录也很容易,只需要将<=改成<即可,SQL语句如下:


selecta.xh,a.price,
(
selectsum(price)fromt_productbwhereb.xh<a.xh)astotalprice
fromt_producta

但上面的SQL查询出来的记录的第一条的totalprice字段值为null,如图4所示。


4

为了将这个null换成10,可以使用case语句,SQL语句如下:


selectxh,price,
(
casewhentotalpriceisnullthenpriceelsetotalpriceend)astotalprice
from
(
selecta.xh,(selectsum(price)fromt_productbwhereb.xh<a.xh)astotalprice,a.price
fromt_producta)x

在上面的SQL语句共有三层select查询,最里面一层如下:

selectsum(price)fromt_productbwhereb.xh<a.xh)

中间一层的子查询如下:

selecta.xh,(selectsum(price)fromt_productbwhereb.xh<a.xh)astotalprice,a.price
fromt_producta

最外面一层当然就是整个select语句了。

在执行上面的SQL后,将会得到和图3一样的查询结果了。

如果读者不喜欢写太长的SQL,可以将部分内容写到函数里,代码如下:

createfunctionmysum(@xhint,@priceint)returnsint
begin
return(select
(
casewhentotalpriceisnullthen@priceelsetotalpriceend)astotalprice
from(selectsum(price)astotalpricefromt_productwherexh<@xh)x)
end

可使用下面的SQL语句来使用这个函数:

selectxh,price,dbo.mysum(xh,price)astotalprice
fromt_product

在执行上面的SQL后,将得出如图3所示的查询结果。

建立t_product表的SQL语句(SQL Server 2005)如下:

SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
IFNOTEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[t_product]')ANDtypein(N'U'))
BEGIN
CREATETABLE[dbo].[t_product](
[xh][int]NOTNULL,
[price][int]NOTNULL,
CONSTRAINT[PK_t_product]PRIMARYKEYCLUSTERED
(
[xh]ASC
)
WITH(IGNORE_DUP_KEY=OFF)ON[PRIMARY]
)
ON[PRIMARY]
END
分享到:
评论

相关推荐

    sql迭代查询[参考].pdf

    本文以SQL Server为例,探讨如何利用聚合函数和子查询实现迭代求和。 首先,我们要理解问题背景。假设我们有一个名为`t_product`的表,包含两个字段:`xh`(主索引字段)和`price`。我们的目标是创建一个新的字段`...

    sql迭代查询分享.pdf

    在SQL Server中,我们可以利用子查询和聚合函数SUM来实现这样的迭代求和。 在给出的场景中,我们有一个名为t_product的表,包含两个字段:xh(主索引字段)和price。目标是创建一个新的字段totalprice,它的值是自...

    microsoft sql server 2008技术内幕 t-sql语言基础

    2. **聚合函数**:SUM、AVG、MAX、MIN和COUNT等聚合函数用于对一组值进行计算,例如求和、平均值、最大值、最小值和计数。 3. **联接操作**:INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN用于合并多个表的数据,...

    经典SqlServer语句大全

    2. **聚合函数**:COUNT(), SUM(), AVG(), MAX(), MIN()等函数用于对一组值进行计算,例如计算记录数、求和、平均值、最大值和最小值。 3. **联接操作**:INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN等...

    T-SQL资源

    `SUM()`, `AVG()`, `COUNT()`, `MIN()`, `MAX()`等聚合函数用于对一组值进行统计计算,如求和、平均值、计数、最小值和最大值。 9. **JOIN操作** T-SQL支持多种类型的JOIN操作,如INNER JOIN、LEFT JOIN、RIGHT ...

    SQL速查手册中文

    2. **聚合函数**:包括SUM、COUNT、AVG、MAX和MIN等,用于对一组值进行计算,例如求和、平均值、最大值和最小值。 3. **联接(JOIN)操作**:如内连接(INNER JOIN)、外连接(LEFT JOIN、RIGHT JOIN、FULL JOIN)...

    IBM DB2 v9.0 SQL帮助文档(英)

    SQL在DB2中的应用涵盖了数据查询、插入、更新、删除等基本操作,以及复杂的联接、子查询、聚合函数和窗口函数等高级功能。以下是一些关键的知识点: 1. **SQL基本语法**:包括SELECT语句用于查询数据,INSERT用于...

    key_functions_in_oracle_sql.rar_in

    在Oracle中,常用的聚合函数包括`COUNT()`(计数)、`SUM()`(求和)、`AVG()`(平均值)、`MAX()`(最大值)和`MIN()`(最小值)。 3. **GROUP BY子句**: GROUP BY与聚合函数一起使用,用于将数据分组。例如,`...

    SQL语句学习

    4. **GROUP BY子句**:将结果集按照一个或多个列的值进行分组,常与聚合函数一起使用。 5. **HAVING子句**:用于过滤GROUP BY子句产生的结果集,与WHERE子句相似,但作用于聚合后的结果。 6. **子句的综合应用**:...

    SQL.rar_oracle

    6. **聚合函数**: Oracle支持一系列聚合函数,如`COUNT()`计算数量,`SUM()`求和,`AVG()`计算平均值,`MAX()`和`MIN()`找出最大和最小值。 7. **游标 (Cursor)**: 游标允许在结果集中逐行处理数据,这对于迭代处理...

    Oracle12c完全参考手册SQL脚本

    6. **聚合函数**:SUM、COUNT、AVG、MAX和MIN等函数用于对一组值进行计算,例如求和、计数、平均值、最大值和最小值。 7. **游标和循环**:在PL/SQL中,游标用于处理单行或多行结果集,而循环结构则允许按步骤执行...

    sql中英文单词及名词解释

    - `GROUPBY`子句用于将结果集中的行分组,通常与聚合函数一起使用。 29. **HAVING 满足…** - `HAVING`子句用于过滤分组后的结果,通常用于过滤分组的条件。 #### 数据类型 - **CHAR** - 定长字符型,用于...

    oracle 函数大全oracle 函数大全

    6. **聚合函数**: - `COUNT()`:计算一组值的数量。 - `SUM()`:对一组数值求和。 - `AVG()`:计算平均值。 - `MAX()`和`MIN()`:找出一组数值中的最大值和最小值。 7. **分析函数**: - `RANK()`、`DENSE_...

    关于oracle 函数的网上资料

    5. **聚合函数**:在SQL查询中,`COUNT()`计算行数,`SUM()`求和,`AVG()`计算平均值,`MAX()`和`MIN()`找出最大值和最小值。 6. **分组和分析函数**:`GROUP BY`用于对数据进行分组,`ROLLUP`和`CUBE`生成多级汇总...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    10.2.5 将子查询因子化应用到PL/SQL中 270 10.3 递归子查询 273 10.3.1 一个CONNECT BY的例子 274 10.3.2 使用RSF的例子 275 10.3.3 RSF的限制条件 276 10.3.4 与CONNECT BY的不同点 276 10.4 复制CONNECT BY...

    2006年某软件公司招聘应届毕业生笔试题.doc

    题目中的SQL查询需求涉及子查询和聚合函数的使用,例如使用 `MIN()` 函数结合子查询来找出特定工作岗位中最低薪资的员工。熟练掌握SQL语法,合理利用索引和查询优化策略,可以显著提高数据检索速度和数据库响应时间...

    oracle.rar_Oracle数据库_SQL_

    3. **聚合函数**:如COUNT(计算行数)、SUM(求和)、AVG(平均值)、MAX(最大值)、MIN(最小值)等,常用于统计分析。 4. **连接操作**:INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN用于合并两个或更多表的...

    epam-db-labs

    3. **聚合函数**:SUM、AVG、MAX、MIN和COUNT等函数用于对一组值执行计算,例如求和、平均值或计数。 4. **子查询**:嵌套在其他查询中的查询,可以用于复杂的数据筛选和计算。 5. **存储过程**:预编译的SQL代码...

    VB笔记集

    - **聚合函数**:`Sum()`, `Avg()`, `Min()`, `Max()`, `Count()`分别用于求和、平均值、最小值、最大值以及计数。 - **INSERT INTO语句**:`Insert Into &lt;表名&gt;(列名) Values(值)`展示了如何插入新记录。 - **...

Global site tag (gtag.js) - Google Analytics