- 카테고리:
- 집계 함수 (일반) , 윈도우 함수 구문 및 사용법 (일반) 
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 |
+-----+---+--------+------------------+----------------+----------------+----------------+----------------+