Freigeben über


GROUP_BY_AGGREGATE-Fehlerklasse

SQLSTATE: 42903

Aggregatfunktionen sind in GROUP BY nicht zulässig, es wurde aber <sqlExpr> gefunden.

Parameter

  • sqlExpr: Ausdruck, der eine Aggregatfunktion enthält.

Erklärung

Der Zweck der GROUP BY-Klausel besteht darin, den Satz unterschiedlicher Gruppen zu identifizieren. Jede Gruppe von Zeilen wird dann mithilfe von Aggregatfunktionen in der SELECT-Liste auf eine einzelne Zeile reduziert. Schließlich können Sie die gruppierten Zeilen dann mithilfe der HAVING-Klausel filtern.

Der sqlExpr befindet sich in der GROUP BY-Klausel anstelle der SELECT-Liste oder der HAVING-Klausel.

Lösung

Die Minderung des Fehlers hängt von der Ursache ab:

  • Haben Sie die richtige Funktion angegeben?

    Ersetzen Sie sqlExpr durch eine geeignete Funktion, die keine Aggregatfunktion ist.

  • Planen Sie die Aggregation des Ausdrucks?

    Entfernen Sie den Ausdruck aus der GROUP BY-Klausel, und fügen Sie ihn der SELECT-Liste hinzu.

  • Beabsichtigen Sie, nach dem aggregierten Ausdruck zu filtern?

    Entfernen Sie den Ausdruck aus der GROUP BY-Klausel, und fügen Sie ihn mithilfe eines BOOLEAN-Operators der HAVING-Klausel hinzu.

Beispiele

-- An aggregation in the GROUP BY clause
> SELECT a FROM VALUES(1, 2), (1, 3) AS T(a, b) GROUP BY a, sum(b);
 [GROUP_BY_AGGREGATE] Aggregate functions are not allowed in GROUP BY, but found sum(T.b).; line 1 pos 58;

-- Move the expression to the SELECT list
> SELECT a, sum(b) FROM VALUES(1, 2), (1, 3) AS T(a, b) GROUP BY a;
 1    5

-- An aggregation in the GROUP BY clause
> SELECT a, sum(b) FROM VALUES(1, 2), (1, 3), (2, 1) AS T(a, b) GROUP BY a, sum(b) > 1;
 [GROUP_BY_AGGREGATE] Aggregate functions are not allowed in GROUP BY, but found (sum(T.b) > CAST(1 AS BIGINT)).; line 1 pos 74;

-- Move the expression to the HAVING clause
> SELECT a, sum(b) FROM VALUES(1, 2), (1, 3), (2, 1) AS T(a, b) GROUP BY a HAVING sum(b) > 1;
 1    5