FirebirdSQL logo

Les fonctions agrégées effectuent un calcul sur un ensemble de valeurs et renvoient une seule valeur.

Les fonctions d’agrégation, à l’exception de COUNT, ne prennent pas en compte les valeurs NULL.Les fonctions agrégées sont souvent utilisées avec la clause GROUP BY.

Les fonctions agrégées ne peuvent être utilisées comme expressions que dans les cas suivants :

  • SELECT liste de sélection des instructions (requête imbriquée ou externe) ;

  • Avoir une clause.

Syntaxe des fonctions d’agrégation
<aggregate_function> ::=
  aggragate_function ([ALL | DISTINCT] <expr>)
  [FILTER (WHERE <condition>)]

Les fonctions agrégées peuvent également être utilisées comme fonctions de fenêtre avec la clause OVER (). Voir Window (Analytique) Functions pour plus de détails.

Fonction FILTER

La clause FILTER étend les fonctions d’agrégation avec la clause optionnelle WHERE.Si la clause FILTER est utilisée, le résultat de l’agrégat est construit uniquement à partir des chaînes qui satisfont également la condition dans la clause optionnelle WHERE.

En général, une clause de filtrage peut être implémentée en utilisant une clause CASE dans une fonction d’agrégation : la condition de filtrage doit être placée dans la clause WHEN, la valeur à agréger dans la clause THEN.Étant donné que les fonctions d’agrégation ignorent généralement les valeurs NULL, la clause implicite ELSE NULL est suffisante pour ignorer les chaînes de caractères qui ne correspondent pas aux conditions du filtre.Les deux expressions suivantes sont équivalentes :

SUM(<expression>) FILTER(WHERE <condition>)

et

SUM(CASE WHEN <condition> THEN <expression> END)

Pour COUNT(*), cet exemple est différent car l’expression * ne peut pas être utilisée dans une clause THEN. A la place, toute valeur constante non égale à NULL est normalement utilisée.

COUNT(*) FILTER(WHERE <condition>)

et

SUM(CASE WHEN <condition> THEN 1 END)
Exemples FILTER
Example 1. Utilisation de la clause FILTER
SELECT
  invoice_year,
  SUM(revenue) FILTER (WHERE invoice_month = 1) AS jan_revenue,
  SUM(revenue) FILTER (WHERE invoice_month= 2) AS feb_revenue,
  ...
  SUM(revenue) FILTER (WHERE invoice_month = 12) AS dec_revenue
FROM (
  SELECT
    EXTRACT(YEAR FROM invoices.invoice_date) AS invoice_year,
    EXTRACT(MONTH FROM invoices.invoice_date) AS invoice_month,
    invoices.revenue AS revenue
  FROM invoices
)
GROUP BY invoice_year