SUM
SUM
집계 함수이자 윈도우 함수로 쓰이는 함수예요. 그룹 안의 NULL이 아닌 레코드들의 합을 구해요. DISTINCT 키워드를 쓰면 고유한 NULL이 아닌 값들의 합을 계산해요.
출처: 공식 문서
본문
expr의 NULL이 아닌 레코드들의 합을 반환합니다. DISTINCT 키워드를 사용해 고유한 NULL이 아닌 값들의 합을 계산할 수 있습니다. 그룹 안의 모든 레코드가 NULL이면 함수는 NULL을 반환합니다.
참고 (See also): COUNT , MAX , MIN
구문 (Syntax)
집계 함수 (Aggregate function)
SUM( [ DISTINCT ] <expr1> )
윈도우 함수 (Window function)
SUM( [ DISTINCT ] <expr1> ) OVER (
[ PARTITION BY <expr2> ]
[ ORDER BY <expr3> [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ] [ <window_frame> ] ]
)
자세한 window_frame 구문은 Window function syntax and usage를 참고하세요.
인자 (Arguments)
expr1
숫자 데이터 타입(INTEGER, FLOAT, DECIMAL 등)으로 평가되는 표현식입니다.
expr2
파티션을 나눌 선택적 표현식입니다.
expr3
각 파티션 내에서 정렬할 선택적 표현식입니다. (이것은 전체 쿼리 출력의 순서를 제어하지 않습니다.)
사용 참고 (Usage notes)
- 숫자 값은 동등하거나 더 큰 데이터 타입으로 합산됩니다.
- VARCHAR 표현식을 전달하면 이 함수는 입력을 부동 소수점 값으로 암시적으로 캐스팅합니다. 캐스팅을 수행할 수 없으면 오류가 반환됩니다.
- 이 함수를 ORDER BY 절을 포함하는 OVER 절과 함께 윈도우 함수로 호출하면:
- 윈도우 프레임이 필수입니다. 프레임을 명시적으로 지정하지 않으면 다음의 암시적 윈도우 프레임이 사용됩니다:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW윈도우 프레임의 구문, 사용 참고, 예제를 포함한 자세한 내용은 Window function syntax and usage를 참고하세요. DISTINCT키워드는 사용할 수 없습니다.
- 윈도우 프레임이 필수입니다. 프레임을 명시적으로 지정하지 않으면 다음의 암시적 윈도우 프레임이 사용됩니다:
예제 (Examples)
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) AS count_i_rows_pre,
SUM(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS sum_i_rows_pre,
AVG(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS avg_i_rows_pre,
MIN(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS min_i_rows_pre,
MAX(i) OVER (PARTITION BY p ORDER BY o ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 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 |
+-----+---+--------+------------------+----------------+----------------+----------------+----------------+