La syntaxe de base
=QUERY(A1:E; "select B, sum(E) where D = 'Payé' group by B"; 1)
- Données : la plage source, en-têtes compris (ici
A1:E, colonnes entières pour inclure les futures lignes). -
Requête : une chaîne de texte entre guillemets droits. Les colonnes sont désignées par leur
lettre (
A,B…), pas par leur titre. -
En-têtes (facultatif) : le nombre de lignes d’en-tête. Indiquez-le explicitement (
1) plutôt que de laisser Sheets deviner.
Le nom de la fonction reste QUERY en français, et les mots-clés de la requête (select,
where…) sont toujours en anglais. Seul le séparateur entre les arguments de la fonction dépend des
paramètres régionaux : point-virgule pour un fichier réglé sur la France.
Les exemples utilisent ce tableau de ventes fictif (onglet Ventes) :
| A : Date | B : Commercial | C : Région | D : Statut | E : Montant |
|---|---|---|---|---|
| 05/01/2026 | Julie | Nord | Payé | 1 200 |
| 12/01/2026 | Karim | Sud | En attente | 450 |
| 03/02/2026 | Julie | Nord | Payé | 3 800 |
| 17/02/2026 | Karim | Est | Payé | 900 |
| 02/03/2026 | Léa | Nord | Annulé | 600 |
L’ordre des clauses
Les clauses sont facultatives, mais quand elles sont présentes, elles doivent apparaître dans cet ordre, sinon la formule renvoie une erreur :
select → where → group by → pivot → order by →
limit → offset → label → format
SELECT : choisir les colonnes
=QUERY(Ventes!A1:E; "select A, B, E"; 1)
Sans select, toutes les colonnes sont renvoyées. L’ordre des colonnes dans select est
l’ordre d’affichage : select E, B met le montant en premier.
WHERE : filtrer les lignes
| Besoin | Clause |
|---|---|
| Texte exact (entre apostrophes) | where C = 'Nord' |
| Nombre | where E >= 1000 |
| Plusieurs conditions | where C = 'Nord' and D = 'Payé' |
| L’une ou l’autre | where C = 'Nord' or C = 'Est' |
| Différent de | where D != 'Annulé' |
| Contient un mot (sensible à la casse) | where B contains 'Ju' |
| Commence par | where B starts with 'K' |
| Ignorer les lignes vides | where A is not null |
| Date (format aaaa-mm-jj imposé) | where A >= date '2026-02-01' |
Les textes s’écrivent entre apostrophes à l’intérieur de la requête, puisque la requête elle-même
est entre guillemets. Les dates, elles, doivent toujours être écrites au format date 'aaaa-mm-jj', quel
que soit l’affichage dans vos cellules.
Utiliser une cellule comme critère
Pour un petit tableau de bord où l’utilisateur choisit la région en H1, on sort de la chaîne et on
concatène avec &, sans oublier les apostrophes autour d’un texte :
=QUERY(Ventes!A1:E; "select B, E where C = '"&H1&"'"; 1)
Pour un nombre, pas d’apostrophes : "select B, E where E >= "&H2.
GROUP BY : regrouper et totaliser
C’est la fonction « tableau croisé dynamique » de QUERY. On choisit une colonne de regroupement et une ou plusieurs
fonctions d’agrégation : sum, count, avg,
min, max.
=QUERY(Ventes!A1:E; "select B, sum(E), count(E) where D = 'Payé' group by B"; 1)
| Commercial | sum Montant | count Montant |
|---|---|---|
| Julie | 5 000 | 2 |
| Karim | 900 | 1 |
Règle à retenir : toute colonne du select qui n’est pas agrégée doit figurer dans le
group by. select B, C, sum(E) group by B renvoie une erreur ; il faut
group by B, C.
Regrouper par mois
Les fonctions year() et month() extraient l’année et le mois d’une date. Piège classique :
month() compte de 0 à 11 (janvier = 0). Ajoutez 1 pour obtenir un numéro de mois
habituel :
=QUERY(Ventes!A1:E; "select year(A), month(A)+1, sum(E) where A is not null group by year(A), month(A)+1 order by year(A), month(A)+1"; 1)
ORDER BY et LIMIT : trier et garder le top
=QUERY(Ventes!A1:E; "select B, sum(E) group by B order by sum(E) desc limit 3"; 1)
desc trie du plus grand au plus petit, asc (par défaut) dans l’autre sens.
limit 3 ne garde que les trois premières lignes : pratique pour un classement des meilleurs commerciaux
ou des produits les plus vendus. offset permet de sauter des lignes (pagination).
LABEL : renommer les colonnes calculées
Par défaut, une colonne agrégée s’intitule « sum Montant ». label remplace ce titre ; plusieurs
libellés se séparent par des virgules :
=QUERY(Ventes!A1:E; "select B, sum(E), count(E) group by B label B 'Commercial', sum(E) 'CA total', count(E) 'Nb ventes'"; 1)
Pour supprimer un en-tête, donnez-lui un libellé vide : label sum(E) ''.
PIVOT : un vrai tableau croisé
pivot transforme les valeurs d’une colonne en colonnes. Chiffre d’affaires par commercial et par
région :
=QUERY(Ventes!A1:E; "select B, sum(E) where D = 'Payé' group by B pivot C"; 1)
Le résultat affiche une ligne par commercial et une colonne par région (Est, Nord…). Une case vide signifie « aucune vente » pour ce couple.
QUERY sur plusieurs onglets ou avec IMPORTRANGE
Quand les données ne proviennent pas directement d’une plage (tableau assemblé avec des accolades, résultat
d’IMPORTRANGE), les lettres de colonnes ne fonctionnent plus : on écrit Col1,
Col2… (avec un C majuscule).
=QUERY({Janvier!A2:E; Février!A2:E}; "select Col2, sum(Col5) where Col1 is not null group by Col2"; 0)
Dans un fichier réglé sur la France, les plages empilées dans les accolades se séparent par un point-virgule (une
barre oblique inversée \ les juxtapose côte à côte).
Aide-mémoire : les requêtes les plus utiles
Toutes s’appuient sur le tableau Ventes ci-dessus ; il suffit d’adapter les lettres de colonnes.
| Besoin | Formule |
|---|---|
| Ventes payées de plus de 1 000 € | =QUERY(Ventes!A1:E; "select * where D = 'Payé' and E > 1000"; 1) |
| Total par région, du plus grand au plus petit | =QUERY(Ventes!A1:E; "select C, sum(E) where C is not null group by C order by sum(E) desc"; 1) |
| Nombre de ventes par statut | =QUERY(Ventes!A1:E; "select D, count(A) where D is not null group by D"; 1) |
| Les 5 plus grosses ventes | =QUERY(Ventes!A1:E; "select A, B, E where E is not null order by E desc limit 5"; 1) |
| Ventes depuis le 1er février 2026 | =QUERY(Ventes!A1:E; "select * where A >= date '2026-02-01'"; 1) |
| Total par commercial et par région | =QUERY(Ventes!A1:E; "select B, sum(E) where B is not null group by B pivot C"; 1) |
Les pièges les plus fréquents
- Colonnes aux types mélangés : QUERY retient le type majoritaire d’une colonne et traite les autres valeurs comme vides. Une colonne de montants où quelques cellules contiennent « N/A » en texte perd ces lignes dans les totaux.
- Guillemets au lieu d’apostrophes autour d’un texte dans la requête : erreur d’analyse garantie.
- Clauses dans le désordre :
order byavantgroup byne passe pas. -
Nom de colonne au lieu de la lettre :
select Montantne fonctionne pas, il fautselect E. -
Plage qui déborde : QUERY écrit ses résultats sur plusieurs lignes et colonnes ; si une cellule de
la zone est déjà remplie, la formule renvoie
#REF!.
FAQ
QUERY ou FILTER : lequel choisir ?
FILTER suffit pour filtrer des lignes selon des conditions et reste plus simple à lire pour un
débutant. Dès qu’il faut regrouper, totaliser, trier et renommer en même temps, QUERY est plus compact.
QUERY ou RECHERCHEV : lequel choisir ?
RECHERCHEV (ou mieux, RECHERCHEX) va chercher une valeur dans une autre
table, par exemple le prix d’une référence. QUERY renvoie toutes les lignes qui correspondent, et
peut les totaliser. Les différences sont détaillées dans le
guide RECHERCHEV, RECHERCHEH et RECHERCHEX.
QUERY est-il sensible à la casse ?
Oui pour les comparaisons de texte (=, contains, starts with). Pour ignorer
la casse, comparez des versions en minuscules : where lower(B) contains 'julie'.
QUERY existe-t-il dans Excel ?
Non. Dans Excel, on combine plutôt FILTRE, TRIER et les tableaux croisés dynamiques, ou
Power Query pour les transformations plus lourdes.
QUERY est au programme du niveau N2 « Google Sheets avancé » de la formation Google Sheets, avec les tableaux croisés dynamiques et IMPORTRANGE. Pour les formules conditionnelles, voir aussi la formule SI avec plusieurs conditions, et pour calculer toute une colonne avec une seule formule, ARRAYFORMULA, MAP et MAKEARRAY.