sum-Aggregatfunktion

Gilt für:check marked yes Databricks SQL check marked yes Databricks Runtime

Gibt die Summe zurück, die aus Werten einer Gruppe berechnet wird.

Syntax

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

Diese Funktion kann auch mithilfe der OVER-Klausel als Fensterfunktion aufgerufen werden.

Argumente

  • expr: Ein Ausdruck, der in einen numerischen Wert oder in ein Intervall ausgewertet wird.
  • cond: Ein optionaler boolescher Ausdruck, der die Zeilen filtern, die für die Aggregation verwendet werden.

Gibt zurück

Wenn expr ein integraler Zahlentyp ist, ein BIGINT. Wenn exprDECIMAL(p, s) ist, ist das Ergebnis DECIMAL(p + min(10, 31-p), s). Wenn expr ein Intervall ist, stimmt der Ergebnistyp mit expr überein.

Andernfalls ein DOUBLE.

Wenn DISTINCT angegeben wird, werden nur eindeutige Werte addiert.

Wenn das Ergebnis einen Überlauf des Ergebnistyps verursacht, löst Databricks SQL einen ARITHMETIC_OVERFLOW-Fehler aus. Um stattdessen NULL zurückzugeben, verwenden Sie try_sum.

Warnung

Wenn in Databricks Runtime spark.sql.ansi.enabled auf false festgelegt ist, verursacht ein Überlauf von BIGINTkeinen Fehler, sondern „umschließt“ stattdessen das Ergebnis.

Beispiele

> 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