Partage via


Classe d’erreur MISSING_AGGREGATION

SQLSTATE : 42803

L’expression non agrégative <expression> est basée sur des colonnes qui ne participent pas à la clause GROUP BY.

Ajoutez les colonnes ou l’expression à GROUP BY, agrégez l’expression ou utilisez <expressionAnyValue> si vous ne vous souciez pas des valeurs d’un groupe retournées.

Paramètres

  • expression : expression non agrégeante, sans regroupement dans la liste SELECT.
  • expressionAnyValue : expression encapsulé dans une fonction d’agrégation any_value().

Explication

Dans le contexte d’une requête avec une clause GROUP BY, les références de colonne locales dans la liste SELECT doivent être :

  • Consommé comme argument à une fonction d’agrégation, ou
  • Une partie d’une expression qui correspond à une expression sur la clause GROUP BY.

Une référence de colonne locale est une colonne qui a été résolue en une référence de table dans la clause FROM de la requête.

En d’autres termes : les références de colonne doivent faire partie des clés de regroupement ou faire partie de l’agrégation.

Azure Databricks met en correspondance des expressions au mieux : par exemple, il reconnaîtra : SELECT c1 + 5 FROM T GROUP BY 5 + c1 comme des expressions mathématiques. Mais SELECT c1 FROM T GROUP BY c1 + 5 n’est pas une correspondance.

Limitation des risques

Le mode d’atténuation de l’erreur dépend de sa cause :

  • Avez-vous manqué une colonne de regroupement ?

    Ajoutez expression, ou la sous-expression appropriée de expression à la clause GROUP BY.

  • La référence de colonne fait-elle partie d’une expression GROUP BY qui diffère de epression ?

    Faites correspondre l’expression dans la liste SELECT ou simplifiez l’expression GROUP BY.

  • Vous manquez l’agrégation ?

    Encapsulez la référence de colonne avec une fonction d’agrégation. Si vous souhaitez uniquement une valeur représentative du groupe, vous pouvez utiliser any_value(expression).

Exemples

-- 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