本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
SUM 範圍函數傳回輸入欄或表達式值的總和。SUM 函數處理數值,且忽略 NULL 值。
語法
SUM ( [ ALL ] expression ) OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list frame_clause ] )
引數
- expression
-
函數運算的目標欄或表達式。
- ALL
-
如果指定引數 ALL,函數會保留表達式中的所有重複值。ALL 為預設值。不支援 DISTINCT。
- OVER
-
指定彙總函數的視窗子句。OVER 子句區分視窗彙總函數和正常組彙總函數。
- PARTITION BY expr_list
-
以一或多個表達式定義 SUM 函數的視窗。
- ORDER BY order_list
-
排序每一個分割區內的列。如果未指定 PARTITION BY,ORDER BY 會使用整個資料表。
- frame_clause
-
如果彙總函數使用 ORDER BY 子句,則需要明確的窗框子句。窗框子句在排序的結果內包含或排除列集,以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 範圍函數語法摘要。
資料類型
SUM 函數支援的引數類型包括 SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL 及 DOUBLE PRECISION。
SUM 函數支援的傳回類型如下:
-
BIGINT 代表 SMALLINT 或 INTEGER 引數
-
NUMERIC 代表 BIGINT 引數
-
DOUBLE PRECISION 代表浮點數引數
範例
下列範例會建立銷售數量的累積 (滾動) 總和,依日期和銷售 ID 排序:
select salesid, dateid, sellerid, qty,
sum(qty) over (order by dateid, salesid rows unbounded preceding) as sum
from winsales
order by 2,1;
salesid | dateid | sellerid | qty | sum
---------+------------+----------+-----+-----
30001 | 2003-08-02 | 3 | 10 | 10
10001 | 2003-12-24 | 1 | 10 | 20
10005 | 2003-12-24 | 1 | 30 | 50
40001 | 2004-01-09 | 4 | 40 | 90
10006 | 2004-01-18 | 1 | 10 | 100
20001 | 2004-02-12 | 2 | 20 | 120
40005 | 2004-02-12 | 4 | 10 | 130
20002 | 2004-02-16 | 2 | 20 | 150
30003 | 2004-04-18 | 3 | 15 | 165
30004 | 2004-04-18 | 3 | 20 | 185
30007 | 2004-09-07 | 3 | 30 | 215
(11 rows)
如需 WINSALES 資料表的描述,請參閱範圍函數範例的範例資料表。
以下範例會依日期建立銷售數量的累積 (滾動) 總和、依賣方 ID 分割結果,然後在分割區內依日期和銷售 ID 排序結果:
select salesid, dateid, sellerid, qty,
sum(qty) over (partition by sellerid
order by dateid, salesid rows unbounded preceding) as sum
from winsales
order by 2,1;
salesid | dateid | sellerid | qty | sum
---------+------------+----------+-----+-----
30001 | 2003-08-02 | 3 | 10 | 10
10001 | 2003-12-24 | 1 | 10 | 10
10005 | 2003-12-24 | 1 | 30 | 40
40001 | 2004-01-09 | 4 | 40 | 40
10006 | 2004-01-18 | 1 | 10 | 50
20001 | 2004-02-12 | 2 | 20 | 20
40005 | 2004-02-12 | 4 | 10 | 50
20002 | 2004-02-16 | 2 | 20 | 40
30003 | 2004-04-18 | 3 | 15 | 25
30004 | 2004-04-18 | 3 | 20 | 45
30007 | 2004-09-07 | 3 | 30 | 75
(11 rows)
以下範例將結果集的所有列依序編號,依 SELLERID 和 SALESID 欄排序:
select salesid, sellerid, qty,
sum(1) over (order by sellerid, salesid rows unbounded preceding) as rownum
from winsales
order by 2,1;
salesid | sellerid | qty | rownum
--------+----------+------+--------
10001 | 1 | 10 | 1
10005 | 1 | 30 | 2
10006 | 1 | 10 | 3
20001 | 2 | 20 | 4
20002 | 2 | 20 | 5
30001 | 3 | 10 | 6
30003 | 3 | 15 | 7
30004 | 3 | 20 | 8
30007 | 3 | 30 | 9
40001 | 4 | 40 | 10
40005 | 4 | 10 | 11
(11 rows)
如需 WINSALES 資料表的描述,請參閱範圍函數範例的範例資料表。
以下範例將結果集的所有列依序編號、依 SELLERID 分割結果,然後在分割區內依 SELLERID 和 SALESID 排序結果:
select salesid, sellerid, qty,
sum(1) over (partition by sellerid
order by sellerid, salesid rows unbounded preceding) as rownum
from winsales
order by 2,1;
salesid | sellerid | qty | rownum
---------+----------+-----+--------
10001 | 1 | 10 | 1
10005 | 1 | 30 | 2
10006 | 1 | 10 | 3
20001 | 2 | 20 | 1
20002 | 2 | 20 | 2
30001 | 3 | 10 | 1
30003 | 3 | 15 | 2
30004 | 3 | 20 | 3
30007 | 3 | 30 | 4
40001 | 4 | 40 | 1
40005 | 4 | 10 | 2
(11 rows)