Si vous utilisez déjà Google Sheets pour suivre des ventes, un budget ou un planning, vous avez sans doute multiplié les filtres, les tris et les tableaux croisés dynamiques. La fonction QUERY remplace tout cela par une seule formule, en apportant la logique du langage SQL directement dans une cellule. Ce tutoriel vous explique sa syntaxe, ses clauses, plus de 20 exemples concrets, sa combinaison avec IMPORTRANGE et les pièges à éviter pour en faire votre outil d'analyse de référence.
Pourquoi la fonction QUERY change tout
La fonction QUERY apporte la logique du SQL sans installation, sans base de données et sans script. En une seule formule, vous pouvez :
- filtrer plusieurs dizaines de milliers de lignes par date, par pays et par montant ;
- grouper par catégorie et calculer une somme ou une moyenne ;
- trier par chiffre d'affaires décroissant ;
- pivoter, c'est-à-dire transformer des valeurs de colonne en colonnes ;
- limiter le résultat au top 10.
Tout cela reste réactif : si les données sources changent, la formule QUERY se met à jour automatiquement. Excel n'a pas d'équivalent natif en formule de cellule, Power Query existant mais imposant une étape de chargement préalable.
La syntaxe de base de QUERY
La fonction prend trois arguments, dont le dernier est facultatif :
=QUERY(data, "REQUÊTE", [headers])
- data : la plage source, par exemple
A1:D1000ouA:D; - REQUÊTE : une chaîne entre guillemets doubles contenant les clauses pseudo-SQL ;
- headers : le nombre de lignes d'en-tête, généralement
1.
Voici l'exemple le plus simple, qui sélectionne deux colonnes et filtre sur une troisième :
=QUERY(A:D, "SELECT A, B WHERE C > 100", 1)
Référencer les colonnes : deux modes à connaître
Avant d'écrire une requête, il faut comprendre comment QUERY désigne les colonnes. Deux modes existent, et les confondre est la première source d'erreur.
Mode 1 : les lettres de colonnes
Quand vous passez une plage directe comme A:D, vous référez les colonnes par leurs lettres : A, B, C, D. C'est le mode le plus courant.
=QUERY(Ventes!A:D, "SELECT A, SUM(D) GROUP BY A")
Mode 2 : les numéros Col1, Col2…
Quand vous passez une plage virtuelle, c'est-à-dire le résultat d'une autre formule comme IMPORTRANGE, vous devez utiliser Col1, Col2, etc.
=QUERY(IMPORTRANGE("url","Data!A:D"), "SELECT Col1, SUM(Col4) GROUP BY Col1")
Les clauses essentielles de QUERY
Une requête QUERY s'écrit en empilant des clauses dans un ordre précis. Voici celles dont vous vous servirez chaque jour.
SELECT : choisir les colonnes
La clause SELECT indique les colonnes à afficher. Les fonctions d'agrégation disponibles sont SUM, AVG, COUNT, MIN et MAX.
SELECT * (toutes les colonnes)
SELECT A, B, C (trois colonnes)
SELECT A, SUM(B) (une colonne et une agrégation)
WHERE : filtrer les lignes
La clause WHERE applique des filtres conditionnels, comme en SQL. Le texte se met entre guillemets simples, car les guillemets doubles servent à délimiter la requête entière.
WHERE A > 100 (numérique)
WHERE B = 'France' (texte, guillemets simples)
WHERE C IS NOT NULL (non vide)
WHERE D LIKE '%client%' (recherche partielle)
WHERE A > 100 AND B = 'France' (combinaison ET)
WHERE A > 100 OR B = 'France' (combinaison OU)
Pour les dates, le format ISO est obligatoire, et attention au mois indexé à partir de zéro, où janvier vaut 0 et décembre 11.
WHERE A > date '2026-01-01' (format ISO obligatoire)
WHERE month(A) = 4 (mai, car les mois vont de 0 à 11)
WHERE year(A) = 2026
GROUP BY : agréger
La clause GROUP BY regroupe les lignes par valeur, indispensable dès que vous utilisez une agrégation sur d'autres colonnes simples.
SELECT A, SUM(B), COUNT(C) GROUP BY A
SELECT A, B, SUM(C) GROUP BY A, B
ORDER BY, LIMIT et OFFSET : trier et paginer
Ces clauses ordonnent et bornent le résultat. Elles se placent après GROUP BY.
ORDER BY A DESC (tri décroissant)
ORDER BY SUM(C) DESC (tri sur une agrégation)
LIMIT 10 (10 premières lignes)
LIMIT 10 OFFSET 20 (lignes 21 à 30, pour la pagination)
PIVOT, LABEL et FORMAT : pivoter et habiller
La clause PIVOT transforme les valeurs uniques d'une colonne en colonnes, comme un tableau croisé dynamique en ligne. LABEL renomme les en-têtes et FORMAT met les nombres en forme.
SELECT A, SUM(D) GROUP BY A PIVOT B
LABEL A 'Mois', SUM(B) 'Total CA'
FORMAT SUM(B) '#,##0.00 €'
Plus de 20 exemples QUERY prêts à copier
Voici une progression d'exemples, du plus simple au plus avancé, applicable à une plage Ventes!A:D contenant des colonnes Date, Pays, Catégorie et Chiffre d'affaires.
| Objectif | Formule |
|---|---|
| Sélection simple | =QUERY(Ventes!A:D, "SELECT *", 1) |
| Filtre numérique | =QUERY(Ventes!A:D, "SELECT * WHERE D > 1000", 1) |
| Filtre texte | =QUERY(Ventes!A:D, "SELECT * WHERE B = 'France'", 1) |
| Filtres combinés | =QUERY(Ventes!A:D, "SELECT A, B, D WHERE B = 'France' AND D > 1000", 1) |
| Tri décroissant | =QUERY(Ventes!A:D, "SELECT * ORDER BY D DESC", 1) |
| Top 10 | =QUERY(Ventes!A:D, "SELECT * ORDER BY D DESC LIMIT 10", 1) |
| Comptage conditionnel | =QUERY(Ventes!A:D, "SELECT COUNT(A) WHERE B = 'France'", 1) |
| Somme par groupe | =QUERY(Ventes!A:D, "SELECT B, SUM(D) GROUP BY B", 1) |
| Plusieurs agrégations | =QUERY(Ventes!A:D, "SELECT B, SUM(D), AVG(D), COUNT(A) GROUP BY B", 1) |
| Top 5 par somme | =QUERY(Ventes!A:D, "SELECT B, SUM(D) GROUP BY B ORDER BY SUM(D) DESC LIMIT 5", 1) |
| Recherche partielle | =QUERY(Ventes!A:D, "SELECT * WHERE LOWER(C) LIKE '%saas%'", 1) |
| Filtre par date | =QUERY(Ventes!A:D, "SELECT * WHERE A > date '2026-01-01'", 1) |
| Filtre par mois et année | =QUERY(Ventes!A:D, "SELECT * WHERE month(A) = 4 AND year(A) = 2026", 1) |
| Pivot | =QUERY(Ventes!A:D, "SELECT A, SUM(D) GROUP BY A PIVOT B", 1) |
| Étiquettes et format | =QUERY(Ventes!A:D, "SELECT B, SUM(D) GROUP BY B LABEL SUM(D) 'Total CA' FORMAT SUM(D) '#,##0 €'", 1) |
| Filtre dynamique par cellule | =QUERY(Ventes!A:D, "SELECT * WHERE B = '"&E1&"'", 1) |
| Pagination | =QUERY(Ventes!A:D, "SELECT * LIMIT 50 OFFSET 100", 1) |
| Données brutes sans en-tête | =QUERY(Ventes!A:D, "SELECT *", 0) |
| Tri composite | =QUERY(Ventes!A:D, "SELECT * ORDER BY B ASC, D DESC", 1) |
| Exclure les valeurs vides | =QUERY(Ventes!A:D, "SELECT * WHERE A IS NOT NULL", 1) |
L'exemple du filtre dynamique mérite une attention particulière : en concaténant le contenu d'une cellule (ici E1) avec l'opérateur &, vous pilotez la requête depuis un menu déroulant, ce qui ouvre la voie aux tableaux de bord interactifs.
Vous voulez automatiser vos analyses Sheets ?
Notre formation vous apprend QUERY, FILTER, IMPORTRANGE et les tableaux de bord dynamiques, à distance ou en présentiel. Démarrage immédiat, paiement en 3× sans frais.
Combiner QUERY et IMPORTRANGE
L'une des combinaisons les plus puissantes consiste à récupérer les données d'un autre classeur avec IMPORTRANGE, puis à les filtrer et les agréger avec QUERY, le tout en une seule formule.
=QUERY(
IMPORTRANGE("https://docs.google.com/.../...","Data!A:D"),
"SELECT Col1, Col2, SUM(Col4) WHERE Col3 = 'France' GROUP BY Col1, Col2 ORDER BY SUM(Col4) DESC",
1
)
Le point de vigilance est toujours le même : avec IMPORTRANGE, vous devez référencer les colonnes en Col1, Col2, etc., et non par leurs lettres. Pensez aussi à autoriser l'accès au classeur source lors du premier appel. Pour aller plus loin sur ce point, consultez notre guide de la fonction IMPORTRANGE.
Cas pratique : un tableau de bord des ventes
Imaginons un fichier Ventes_2026 de 8 000 lignes, avec les colonnes Date, Pays, Catégorie et Chiffre d'affaires. Quelques formules QUERY suffisent à construire un tableau de bord entièrement dynamique.
Chiffre d'affaires du mois en cours
=QUERY(A:D, "SELECT SUM(D) WHERE month(A) = "&MONTH(TODAY())-1&" AND year(A) = "&YEAR(TODAY()), 1)
Top 5 des pays par chiffre d'affaires
=QUERY(A:D, "SELECT B, SUM(D) WHERE year(A) = "&YEAR(TODAY())&" GROUP BY B ORDER BY SUM(D) DESC LIMIT 5 LABEL SUM(D) 'CA' FORMAT SUM(D) '#,##0 €'", 1)
Catégorie la plus rentable
=QUERY(A:D, "SELECT C, SUM(D) GROUP BY C ORDER BY SUM(D) DESC LIMIT 1 LABEL SUM(D) 'CA total'", 1)
Ce tableau de bord est totalement réactif : il suffit d'ajouter une vente dans la feuille source pour que tous les indicateurs se recalculent. Là où Excel demanderait un tableau croisé dynamique, des filtres et parfois une macro, QUERY fait tout en quelques formules.
Les erreurs courantes et comment les corriger
QUERY est puissant, mais sa syntaxe pseudo-SQL piège régulièrement les débutants. Voici les cinq erreurs les plus fréquentes.
- Confondre guillemets simples et doubles : le texte d'un filtre se met entre guillemets simples (
'France'), les guillemets doubles délimitant la requête entière. - Oublier l'argument des en-têtes : sans le
1final, QUERY peut interpréter votre première ligne comme une donnée et fausser les agrégations. Précisez toujours, 1quand vos données ont des en-têtes. - Mauvais format de date :
WHERE A = "01/01/2026"ne fonctionne pas. Le format obligatoire estWHERE A = date '2026-01-01'. - Mois indexé à partir de zéro :
WHERE month(A) = 5renvoie juin, pas mai. Soustrayez toujours 1, soitWHERE month(A) = 4pour mai. - Types mixtes dans une colonne : si une colonne mélange nombres et texte, QUERY peut ignorer des lignes ou renvoyer une erreur. Nettoyez les données ou ajoutez
WHERE A IS NUMBER.
Une fois ces réflexes acquis, la fonction QUERY remplace à elle seule un tableau croisé dynamique, des filtres, un tri et un top N. C'est précisément ce type de compétences que vous travaillez en profondeur dans notre formation Google Sheets certifiante, qui vous rend autonome sur le tableur, des fondamentaux jusqu'aux analyses avancées.
Cette formation débouche sur une certification ICDL (Tableur) reconnue et reste éligible au CPF. Vous pouvez la suivre à distance ou en présentiel, avec un démarrage immédiat et un paiement en 3 fois sans frais. Pour compléter ce tutoriel, découvrez aussi notre guide de la fonction FILTER, plus simple pour les extractions basiques.



