- カテゴリ:
集計関数 (一般)、 ウィンドウ関数の構文と使用法 (一般)
SUM¶
expr
NULL 以外のレコードの合計を返します。DISTINCT キーワードを使用して、一意のnull以外の値の合計を計算できます。グループ内のすべてのレコードが NULLの場合、関数は NULLを返します。
構文¶
集計関数
SUM( [ DISTINCT ] <expr1> )
ウィンドウ関数
SUM( [ DISTINCT ] <expr1> ) OVER ( [ PARTITION BY <expr2> ] [ ORDER BY <expr3> [ ASC | DESC ] [ <window_frame> ] ] )
window_frame
の構文の詳細については、 ウィンドウ関数の構文と使用法 をご参照ください。
引数¶
expr1
これは、数値データ型(INTEGER、 FLOAT、 DECIMALなど)に評価される式です。
expr2
これは、パーティションを分割するオプションの式です。
expr3
これは、各パーティション内で並べ替えるオプションの式です。(これは、クエリ出力全体の順序を制御しません)
使用上の注意¶
数値は、同等またはそれ以上のデータ型に合計されます。
VARCHAR 式が渡されると、この関数は入力を暗黙的に浮動小数点値にキャストします。キャストを実行できない場合、エラーが返されます。
この関数が、 ORDER BY 句を含む OVER 句を持つウィンドウ関数として呼び出される場合:
ウィンドウフレームが必要です。ウィンドウフレームが明示的に指定されていない場合、次のような暗黙のウィンドウフレームが使用されます。
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
構文、使用上の注意、例を含むウィンドウフレームの詳細については、 ウィンドウ関数の構文と使用法 をご参照ください。
ウィンドウ関数内でキーワード DISTINCT を使用することは禁止されており、コンパイル時間エラーが発生します。
例¶
CREATE OR REPLACE TABLE sum_example(k INT, d DECIMAL(10,5), s1 VARCHAR(10), s2 VARCHAR(10)); INSERT INTO sum_example VALUES (1, 1.1, '1.1','one'), (1, 10, '10','ten'), (2, 2.2, '2.2','two'), (2, null, null,'null'), (3, null, null, 'null'), (null, 9, '9.9','nine'); SELECT * FROM sum_example;
+------+----------+------+------+ | K | D | S1 | S2 | |------+----------+------+------| | 1 | 1.10000 | 1.1 | one | | 1 | 10.00000 | 10.0 | ten | | 2 | 2.20000 | 2.2 | two | | 2 | NULL | NULL | null | | 3 | NULL | NULL | null | | NULL | 9.00000 | 9.9 | nine | +------+----------+------+------+
SELECT SUM(d), SUM(s1) FROM sum_example;
+----------+---------+ | SUM(D) | SUM(S1) | |----------+---------| | 22.30000 | 23.2 | +----------+---------+
SELECT k, SUM(d), SUM(s1) FROM sum_example GROUP BY k;
+------+----------+---------+ | K | SUM(D) | SUM(S1) | |------+----------+---------| | 1 | 11.10000 | 11.1 | | 2 | 2.20000 | 2.2 | | 3 | NULL | NULL | | NULL | 9.00000 | 9.9 | +------+----------+---------+
SELECT SUM(s2) FROM sum_example;
100038 (22018): Numeric value 'one' is not recognized
以下のスクリプトは、この関数(および他のいくつかの集計ウィンドウ関数)の使用を示しています。
CREATE OR REPLACE TABLE example_cumulative (p INT, o INT, i INT); INSERT INTO example_cumulative VALUES ( 0, 1, 10), (0, 2, 20), (0, 3, 30), (100, 1, 10),(100, 2, 30),(100, 2, 5),(100, 3, 11),(100, 3, 120), (200, 1, 10000),(200, 1, 200),(200, 1, 808080),(200, 2, 33333),(200, 3, null), (200, 3, 4), (300, 1, null), (300, 1, null);
SELECT p, o, i, COUNT(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) count_i_Rows_Pre, SUM(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) sum_i_Rows_Pre, AVG(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) avg_i_Rows_Pre, MIN(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) min_i_Rows_Pre, MAX(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_i_Rows_Pre FROM example_cumulative ORDER BY p,o; +-----+---+--------+------------------+----------------+----------------+----------------+----------------+ | P | O | I | COUNT_I_ROWS_PRE | SUM_I_ROWS_PRE | AVG_I_ROWS_PRE | MIN_I_ROWS_PRE | MAX_I_ROWS_PRE | |-----+---+--------+------------------+----------------+----------------+----------------+----------------| | 0 | 1 | 10 | 1 | 10 | 10.000 | 10 | 10 | | 0 | 2 | 20 | 2 | 30 | 15.000 | 10 | 20 | | 0 | 3 | 30 | 3 | 60 | 20.000 | 10 | 30 | | 100 | 1 | 10 | 1 | 10 | 10.000 | 10 | 10 | | 100 | 2 | 30 | 2 | 40 | 20.000 | 10 | 30 | | 100 | 2 | 5 | 3 | 45 | 15.000 | 5 | 30 | | 100 | 3 | 11 | 4 | 56 | 14.000 | 5 | 30 | | 100 | 3 | 120 | 5 | 176 | 35.200 | 5 | 120 | | 200 | 1 | 10000 | 1 | 10000 | 10000.000 | 10000 | 10000 | | 200 | 1 | 200 | 2 | 10200 | 5100.000 | 200 | 10000 | | 200 | 1 | 808080 | 3 | 818280 | 272760.000 | 200 | 808080 | | 200 | 2 | 33333 | 4 | 851613 | 212903.250 | 200 | 808080 | | 200 | 3 | NULL | 4 | 851613 | 212903.250 | 200 | 808080 | | 200 | 3 | 4 | 5 | 851617 | 170323.400 | 4 | 808080 | | 300 | 1 | NULL | 0 | NULL | NULL | NULL | NULL | | 300 | 1 | NULL | 0 | NULL | NULL | NULL | NULL | +-----+---+--------+------------------+----------------+----------------+----------------+----------------+