SQL Server聚合函式和子查詢迭代求和方法

2021-04-25 21:00:54 字數 1117 閱讀 4288

2008-09-04 11:42

本文介紹了在sql server中使用聚合函式和子查詢迭代求和的公式與方法。

先看看下面的表和其中的資料:

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 a.xh, a.price,

(select sum(price) from t_product b where b.xh <= a.xh) as totalprice

from t_product a

從上面的sql語句可以看出,使用了乙個子查詢來求totalprice欄位的值,基本原理就是根據當前記錄的xh值(a.xh)來計算從當前記錄往前所有記錄的price值之和,b.xh表示子查詢當前的xh值,在子查詢中,a.xh相當於常量。上面的sql語句的查詢結果和圖2完全一樣。如果我們的需求是不包含當前記錄的price值,也就是說,計算totalprice欄位的公式如下:

當前記錄的totalprice值=上一條當前記錄的price值+上一條記錄的totalprice值

group by 和 聚合函式

01.from test 該句執行後,應該結果和表1一樣,就是原來的表。02.from test group by name 該句執行後,我們想象生成了虛擬表3,如下所圖所示,生成過程是這樣的 group by name,那麼找name那一列,具有相同name值的行,合併成一行,如對於name值為a...

group by和聚合函式

原文 為什麼不能夠select from table group by id,為什麼一定不能是 而只能是某乙個列或者某個列的聚合函式,group by 多個字段可以怎麼去很好的理解呢?正文開始 先來看下表1,表名為test 表一 test 執行如下sql語句 select name from tes...

深入學習SQL Server聚合函式演算法優化技巧

sql server聚合函式在實際工作中應對各種需求使用的還是很廣泛的,對於聚合函式的優化自然也就成為了乙個重點,乙個程式優化的好不好直接決定了這個程式的宣告週期。sql server聚合函式對一組值執行計算並返回單一的值。聚合函式對一組值執行計算,並返回單個值。除了 count 以外,聚合函式都會...