第十一章 SQL聚合函數(shù) SUM
返回指定列值之和的聚合函數(shù)婉商。
大綱
SUM([ALL | DISTINCT [BY(col-list)]] expression [%FOREACH(col-list)] [%AFTERHAVING])
參數(shù)
-
ALL
- 可選-指定SUM
返回表達(dá)式中所有值的和。
如果沒(méi)有指定關(guān)鍵字柳譬,這是默認(rèn)值透葛。 -
DISTINCT
- 可選-一個(gè)DISTINCT
子句,指定SUM
返回表達(dá)式中不同(唯一)值的和搭儒。
DISTINCT
可以指定BY(colo -list)
子句穷当,其中colo -list
可以是單個(gè)字段,也可以是用逗號(hào)分隔的字段列表淹禾。 -
expression
- 任何有效的表達(dá)式馁菜。
通常是包含要求和的數(shù)據(jù)值的列的名稱(chēng)。 -
%FOREACH(col-list)
- 可選-列名或以逗號(hào)分隔的列名列表铃岔。 -
%AFTERHAVING
- 可選-應(yīng)用在HAVING
子句中的條件汪疮。
SUM
返回與expression
相同的數(shù)據(jù)類(lèi)型,但有如下異常:TINYINT
毁习、SMALLINT
和INTEGER
返回的數(shù)據(jù)類(lèi)型都是INTEGER
智嚷。
注意:SUM
可以指定為聚合函數(shù),也可以指定為窗口函數(shù)纺且。
本參考頁(yè)面描述了SUM
作為聚合函數(shù)的使用盏道。
SUM
作為一個(gè)窗口函數(shù)在窗口函數(shù)概述中描述。
描述
SUM
聚合函數(shù)返回表達(dá)式值的和载碌。
通常猜嘱,表達(dá)式是查詢(xún)返回的多行中字段的名稱(chēng)(或包含一個(gè)或多個(gè)字段名稱(chēng)的表達(dá)式)衅枫。
SUM
可以在引用表或視圖的SELECT
查詢(xún)或子查詢(xún)中使用。
SUM
可以在SELECT
列表或HAVING
子句中與普通字段值一起出現(xiàn)朗伶。
SUM
不能在WHERE
子句中使用弦撩。
SUM
不能在JOIN
的ON
子句中使用,除非SELECT
是子查詢(xún)论皆。
和所有聚合函數(shù)一樣益楼,SUM
可以接受一個(gè)可選的DISTINCT
子句。
SUM(DISTINCT col1)
只匯總那些不同(唯一)的col1
字段值点晴。
SUM(DISTINCT BY(col2) col1)
只匯總col2
值不同(唯一)的記錄中的col1
字段值感凤。
但是請(qǐng)注意,不同的col2
值可能包含一個(gè)單獨(dú)的NULL
值觉鼻。
數(shù)據(jù)值
對(duì)于數(shù)據(jù)類(lèi)型為INT
俊扭、SMALLINT
或TINYINT
的表達(dá)式,SUM
返回的數(shù)據(jù)類(lèi)型為INTEGER
坠陈。
對(duì)于數(shù)據(jù)類(lèi)型為BIGINT
的表達(dá)式,SUM
返回?cái)?shù)據(jù)類(lèi)型BIGINT
捐康。
對(duì)于數(shù)據(jù)類(lèi)型為DOUBLE
的表達(dá)式仇矾,SUM
返回?cái)?shù)據(jù)類(lèi)型為DOUBLE
的表達(dá)式。
對(duì)于所有其他數(shù)字?jǐn)?shù)據(jù)類(lèi)型解总,SUM
返回?cái)?shù)據(jù)類(lèi)型numeric
贮匕。
SUM
返回精度為18
的值。
返回值的尺度與表達(dá)式的尺度相同花枫,但有以下例外刻盐。
如果expression
是一個(gè)數(shù)據(jù)類(lèi)型為VARCHAR
或VARBINARY
的數(shù)值,則返回值的尺度為8劳翰。
默認(rèn)情況下敦锌,聚合函數(shù)使用邏輯(內(nèi)部)數(shù)據(jù)值,而不是顯示值佳簸。
SUM
通常應(yīng)用于具有數(shù)值的字段或表達(dá)式乙墙。
因?yàn)橹粓?zhí)行最小的類(lèi)型檢查,所以有可能(盡管很少有意義)對(duì)非數(shù)字字段調(diào)用它生均。
SUM
計(jì)算包括空字符串("
)在內(nèi)的非數(shù)值值為0
(0)听想。如果expression
是數(shù)據(jù)類(lèi)型VARCHAR
,則返回到ODBC或JDBC的值是數(shù)據(jù)類(lèi)型DOUBLE
马胧。
在派生SUM
聚合函數(shù)值時(shí)汉买,數(shù)據(jù)字段中的NULL
值將被忽略。
如果查詢(xún)沒(méi)有返回任何行佩脊,或者返回的所有行的數(shù)據(jù)字段值為NULL
, SUM
返回NULL
蛙粘。
優(yōu)化
SUM
計(jì)算的SQL優(yōu)化可以使用一個(gè)位片索引垫卤,如果這個(gè)索引是為字段定義的。
當(dāng)前事務(wù)期間所做的更改
與所有聚合函數(shù)一樣组题,SUM
總是返回?cái)?shù)據(jù)的當(dāng)前狀態(tài)葫男,包括未提交的更改,而不考慮當(dāng)前事務(wù)的隔離級(jí)別崔列。
示例
在下面的例子中梢褐,美元符號(hào)($
)連接到薪金數(shù)額。
下面的查詢(xún)返回示例中所有員工的工資之和赵讯。
雇員數(shù)據(jù)庫(kù):
SELECT '$' || SUM(Salary) AS Total_Payroll
FROM Sample.Employee
下面的查詢(xún)使用 %AFTERHAVING
必須返回所有工資的總和和每個(gè)州超過(guò)$80,000
的工資的總和盈咳,其中至少有一個(gè)人的工資為> $80,000
:
SELECT Home_State,
'$' || SUM(Salary) AS Total_Payroll,
'$' || SUM(Salary %AFTERHAVING) AS Exec_Payroll
FROM Sample.Employee
GROUP BY Home_State
HAVING Salary > 80000
ORDER BY Home_State
下面的查詢(xún)返回示例中每個(gè)職位工資的總和和平均值。
雇員數(shù)據(jù)庫(kù):
SELECT Title,
'$' || SUM(Salary) AS Total,
'$' || AVG(Salary) AS Average
FROM Sample.Employee
GROUP BY Title
ORDER BY Average
下面的查詢(xún)顯示了與算術(shù)表達(dá)式一起使用的SUM
边翼。
對(duì)于示例中的每個(gè)職位名稱(chēng)鱼响。
員工數(shù)據(jù)庫(kù),返回當(dāng)前工資和工資增加10%
的工資之和:
SELECT Title,
'$' || SUM(Salary) AS BeforeRaises,
'$' || SUM(Salary * 1.1) AS AfterRaises
FROM Sample.Employee
GROUP BY Title
ORDER BY Title
下面的查詢(xún)顯示了使用CASE
語(yǔ)句與邏輯表達(dá)式一起使用的SUM
组底。
它計(jì)算所有受薪員工丈积,并使用SUM
計(jì)算所有年薪為9萬(wàn)美元或以上的受薪員工。
SELECT COUNT(Salary) As AllPaid,
SUM(CASE WHEN (Salary >= 90000)
THEN 1 ELSE 0 END) As TopPaid
FROM Sample.Employee