Freigeben über


MISSING_AGGREGATION-Fehlerklasse

SQLSTATE: 42803

Der nicht aggregierende Ausdruck <expression> basiert auf Spalten, die nicht an der GROUP BY-Klausel beteiligt sind.

Fügen Sie die Spalten oder den Ausdruck zur GROUP BY-Klausel hinzu, aggregieren Sie den Ausdruck, oder verwenden Sie <expressionAnyValue>, wenn es keine Rolle spielt, welcher der Werte innerhalb einer Gruppe zurückgegeben wird.

Parameter

  • Ausdruck: Nicht aggregierender, nicht gruppierender Ausdruck in der SELECT-Liste.
  • expressionAnyValue: expression, umschlossen in einer any_value()-Aggregatfunktion.

Erklärung

Im Kontext einer Abfrage mit einer GROUP BY-Klausel muss für die lokalen Spaltenverweise in der SELECT-Liste Folgendes zutreffen:

  • Verwendung als Argument für eine Aggregatfunktion oder
  • Teil eines Ausdrucks, der mit einem Ausdruck in der GROUP BY-Klausel übereinstimmt

Ein lokaler Spaltenverweis ist eine Spalte, die zu einem Tabellenverweis in der FROM-Klausel der Abfrage aufgelöst wurde.

Anders ausgedrückt: Spaltenverweise müssen entweder Teil der Gruppierungsschlüssel oder Teil der Aggregation sein.

Azure Databricks gleicht Ausdrücke nach dem Best Effort-Prinzip (bestmöglich) ab: SELECT c1 + 5 FROM T GROUP BY 5 + c1 wird beispielsweise als mathematischer Ausdruck erkannt. SELECT c1 FROM T GROUP BY c1 + 5 dagegen ist keine Übereinstimmung.

Lösung

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

  • Fehlte eine Gruppierungsspalte?

    Fügen Sie der GROUP BY-Klausel expression oder den relevanten Teilausdruck von expression hinzu.

  • Ist der Spaltenverweis Teil eines GROUP BY-Ausdrucks, der sich von epression unterscheidet?

    Gleichen Sie den Ausdruck in der Liste SELECT ab, oder vereinfachen Sie den GROUP BY-Ausdruck.

  • Fehlt die Aggregation?

    Umschließen Sie den Spaltenverweis mit einer Aggregatfunktion. Wenn Sie nur einen repräsentativen Wert aus der Gruppe wünschen, können Sie any_value(expression) verwenden.

Beispiele

-- Sample data
> CREATE OR REPLACE TEMPORARY VIEW tasks(name, firstname, task, cost) AS
   VALUES ('Smith'  , 'Sam'   , 'UNPIVOT', 10),
          ('Smith'  , 'Sam'   , 'LATERAL',  5),
          ('Shuster', 'Sally' , 'DELETE' ,  7),
          ('Shuster', 'Sally' , 'GRANT'  ,  8);

-- `name` and `firstname` are part of the group by coumns, but incomplete
> SELECT name, firstname, sum(cost) FROM tasks GROUP BY firstname || ' ' || name;
 [MISSING_AGGREGATION] The expression "name" is neither present in the group by, nor is it an aggregate function.

-- Match the GROUP BY expression
> SELECT firstname || ' ' || name, sum(cost) FROM tasks GROUP BY firstname || ' ' || name;
 Sam Smith      15
 Sally Shuster  15

-- Break up the GROUP BY expression
> SELECT firstname, name, sum(cost) FROM tasks GROUP BY firstname, name;
 Sam    Smith   15
 Sally  Shuster 15

-- Missing grouping column
> SELECT name, firstname, sum(cost) FROM tasks GROUP BY name;
 [MISSING_AGGREGATION] The expression "firstname" is neither present in the group by, nor is it an aggregate function.

-- Add the grouping column
> SELECT firstname, name, sum(cost) FROM tasks GROUP BY firstname, name;
 Sam    Smith   15
 Sally  Shuster 15

-- Missing aggregate
> SELECT firstname, name, sum(cost), task FROM tasks GROUP BY firstname, name;
 [MISSING_AGGREGATION] The expression "task" is neither present in the group by, nor is it an aggregate function.

-- Add an aggregate
> SELECT firstname, name, sum(cost), array_agg(task) FROM tasks GROUP BY firstname, name;
 Sam    Smith   15  ["UNPIVOT","LATERAL"]
 Sally  Shuster 15  ["DELETE","GRANT"]

-- Return any task
> SELECT firstname, name, sum(cost), any_value(task) FROM tasks GROUP BY firstname, name;
 Sam    Smith   15  LATERAL
 Sally  Shuster 15  DELETE