sum (función de agregado)

Se aplica a:check marked yes Databricks SQL check marked yes Databricks Runtime

Devuelve el valor sum calculado a partir de los valores de un grupo.

Sintaxis

sum ( [ALL | DISTINCT] expr ) [FILTER ( WHERE cond ) ]

Esta función también se puede invocar como una función de ventana mediante la cláusula OVER.

Argumentos

  • expr: expresión que se evalúa como un valor numérico o intervalo.
  • cond: expresión booleana opcional que filtra las filas usadas para la agregación.

Devoluciones

Si expr es un tipo de número entero, se devuelve un valor BIGINT. Si expr es DECIMAL(p, s), el resultado es DECIMAL(p + min(10, 31-p), s). Si es expr un intervalo, el tipo de resultado coincide con expr.

De lo contrario, DOUBLE.

Si se especifica DISTINCT, solo se suman los valores únicos.

Si el resultado desborda el tipo de resultado, Databricks SQL produce un error ARITHMETIC_OVERFLOW. Para devolver un valor NULL en su lugar, use try_sum.

Advertencia

En Databricks Runtime, si spark.sql.ansi.enabled es false, un desbordamiento de BIGINT no provoca un error, sino que "ajusta" el resultado.

Ejemplos

> SELECT sum(col) FROM VALUES (5), (10), (15) AS tab(col);
 30

> SELECT sum(col) FILTER(WHERE col <15)
    FROM VALUES (5), (10), (15) AS tab(col);
 15

> SELECT sum(DISTINCT col) FROM VALUES (5), (10), (10), (15) AS tab(col);
 30

> SELECT sum(col) FROM VALUES (NULL), (10), (15) AS tab(col);
 25

> SELECT sum(col) FROM VALUES (NULL), (NULL) AS tab(col);
 NULL

-- try_sum overflows a BIGINT
> SELECT try_sum(c1) FROM VALUES(5E18::BIGINT), (5E18::BIGINT) AS tab(c1);
 NULL

-- In ANSI mode sum returns an error if it overflows BIGINT
> SELECT sum(c1) FROM VALUES(5E18::BIGINT), (5E18::BIGINT) AS tab(c1);
 Error: ARITHMETIC_OVERFLOW

-- try_sum overflows an INTERVAL
> SELECT try_sum(c1) FROM VALUES(INTERVAL '100000000' YEARS), (INTERVAL '100000000' YEARS) AS tab(c1);
  NULL

-- sum returns an error on INTERVAL overflow
> SELECT sum(c1) FROM VALUES(INTERVAL '100000000' YEARS), (INTERVAL '100000000' YEARS) AS tab(c1);
 Error: ARITHMETIC_OVERFLOW