Comment utiliser QUERY() dans Google Sheets sans trop souffrir
Tu veux du SQL dans Sheets. QUERY() te le donne. Avec une petite moustache Google Visualization : puissant, rapide à prototyper… et parfois capricieux sur les types (dates/nombres) et la locale. On va tout couvrir : du “filtrer 3 lignes” au pivot + agrégation + requêtes dynamiques.
- Comment utiliser QUERY() dans Google Sheets sans trop souffrir
- 1) C’est quoi QUERY() dans Google Sheets ?
- 2) Quelle est la syntaxe exacte de QUERY() ?
- 3) Quel dataset utiliser pour les exercices ?
- 4) Quelles clauses QUERY existent (et dans quel ordre) ?
- 5) Cas d'usage courant
- 6) Tous les “petits” use cases qu’on oublie (et qui font gagner du temps)
- 7) Les erreurs fréquentes (et comment les corriger )
- 8) Quand QUERY() est le bon outil… et quand il faut arrêter
- 9) Pack d’exercices
- Exercice 3 — “Filtrer par ville + période (paramètres)”

Sources officielles :
- Doc Google Sheets — fonction
QUERY(syntaxe + exemples) - Référence du langage Google Visualization Query Language (clauses, littéraux, fonctions, ordre)
Formez-vous à Google Sheets !
🚀 Nos formations Google Sheets vous accompagnent pour passer d’une utilisation basique à une vraie expertise en manipulation de données. Vous apprendrez à structurer, analyser et automatiser vos feuilles de calcul pour en faire des outils puissants et adaptés à vos besoins métiers. Fonctions avancées, requêtes dynamiques, visualisation pertinente : tout est pensé pour libérer le potentiel de Google Sheets dans votre quotidien professionnel. 📊✨
1) C’est quoi QUERY() dans Google Sheets ?
QUERY() exécute une requête (style SQL) sur une plage de cellules et renvoie un résultat calculé ailleurs. La source ne bouge pas. Ton report, lui, vit sa vie.
Visuel — “Source → Requête → Report”
[DATA: table brute] --QUERY()--> [REPORT: table filtrée/triée/agrégée]2) Quelle est la syntaxe exacte de QUERY() ?
Syntaxe
=QUERY(data; "query"; [headers])- data : plage (ex:
DATA!A1:H) - « query » : texte de requête (toujours entre guillemets)
- headers : nombre de lignes d’en-tête dans
data(souvent1)
Erreur classique
headersmal réglé → Google inventeCol1,Col2, ou te décale tout.
3) Quel dataset utiliser pour les exercices ?
Crée un onglet DATA et colle ceci en A1 (8 colonnes) :
| order_id | order_date | customer | city | product | category | qty | total |
|---|---|---|---|---|---|---|---|
| 1001 | 2025-01-03 | Karim | Lyon | Sandwich | Food | 2 | 18.90 |
| 1002 | 2025-01-03 | Léa | Paris | Steak | Food | 1 | 24.00 |
| 1003 | 2025-01-04 | Karim | Lyon | Soda | Drink | 3 | 7.50 |
| 1004 | 2025-01-05 | Nina | Lille | Sandwich | Food | 1 | 9.45 |
| 1005 | 2025-01-05 | Léa | Paris | Salad | Food | 2 | 16.00 |
| 1006 | 2025-01-06 | Omar | Lyon | Coffee | Drink | 2 | 6.20 |
| 1007 | 2025-01-06 | Nina | Lille | Steak | Food | 1 | 25.00 |
| 1008 | 2025-01-07 | Karim | Lyon | Sandwich | Food | 4 | 37.80 |
4) Quelles clauses QUERY existent (et dans quel ordre) ?
L’ordre est strict (et Google ne négocie pas) :
SELECT → WHERE → GROUP BY → PIVOT → ORDER BY → LIMIT → OFFSET → LABEL → FORMAT
SELECT (colonnes/calculs)
WHERE (filtres)
GROUP BY (agréger)
PIVOT (croiser)
ORDER BY (trier)
LIMIT/OFFSET (paginer)
LABEL/FORMAT (présenter)5) Cas d’usage courant
Cas 1 — “Je veux juste filtrer une table”
1) Tout afficher (sanity check)
=QUERY(DATA!A1:H; "select *"; 1)2) Choisir des colonnes + ordre
=QUERY(DATA!A1:H; "select C, E, H"; 1)3) Filtrer numérique (montant >= 20)
=QUERY(DATA!A1:H; "select A, B, C, H where H >= 20"; 1)4) Filtrer texte (ville = Lyon)
=QUERY(DATA!A1:H; "select A, C, D, E, H where D = 'Lyon'"; 1)Cas 2 — “Filtrer par date ”
Les dates sont le piège numéro 1 : dans le langage de requête, une date s’écrit avec un littéral :
date 'yyyy-mm-dd'(Officiel, côté Query Language.)
1) Filtrer “à partir du 2025-01-05”
=QUERY(DATA!A1:H; "select A, B, C, H where B >= date '2025-01-05'"; 1)2) Filtrer entre deux dates
=QUERY(DATA!A1:H; "select A, B, C, H where B >= date '2025-01-04' and B <= date '2025-01-06'"; 1)3) Date dynamique (date dans une cellule)
Supposons :
REPORT!B1contient une date (ex: 2025-01-05)
=QUERY(DATA!A1:H;
"select A, B, C, H where B >= date '" & TEXT(B1;"yyyy-mm-dd") & "'";
1)Oui, c’est moche. Mais c’est fiable : tu passes une date au format que QUERY comprend. (Approche courante, documentée partout depuis des années, et cohérente avec la spec.)
Cas 3 — “Recherche texte avancée (contains / starts with / matches regex)”
Le langage supporte des opérateurs utiles (proches SQL, mais pas identiques).
1) Commence par
=QUERY(DATA!A1:H; "select * where E starts with 'S'"; 1)2) Contient
=QUERY(DATA!A1:H; "select * where E contains 'wich'"; 1)3) Regex (matches)
Tous les produits contenant “a” ou “e” (regex très simple)
=QUERY(DATA!A1:H; "select * where E matches '.*(a|e).*'"; 1)La liste exacte des clauses/structures est dans la doc Query Language.
Cas 4 — “Trier et paginer (ORDER BY / LIMIT / OFFSET)”
1) Trier par montant décroissant
=QUERY(DATA!A1:H; "select A, C, E, H order by H desc"; 1)2) Top 3
=QUERY(DATA!A1:H; "select A, C, E, H order by H desc limit 3"; 1)3) Page 2 (skip 3, prends 3)
=QUERY(DATA!A1:H; "select A, C, E, H order by H desc limit 3 offset 3"; 1)Cas 5 — “Agrégation (GROUP BY) : faire un mini report”
Règle : tout ce que tu sélectionnes doit être agrégé ou présent dans GROUP BY.
1) Total dépensé par client
=QUERY(DATA!A1:H;
"select C, sum(H)
group by C
order by sum(H) desc
label sum(H) 'Total dépensé'";
1)2) Nombre de commandes par ville
=QUERY(DATA!A1:H;
"select D, count(A)
group by D
order by count(A) desc
label count(A) 'Nb commandes'";
1)3) Panier moyen par client
=QUERY(DATA!A1:H;
"select C, avg(H)
group by C
order by avg(H) desc
label avg(H) 'Panier moyen'";
1)Cas 6 — “Tableau croisé dynamique en formule (PIVOT)”
Tu veux un pivot sans passer par l’outil Pivot Table.
Dépenses par client, pivotées par catégorie
=QUERY(DATA!A1:H;
"select C, sum(H)
group by C
pivot F
label sum(H) 'Dépenses'";
1)Résultat attendu :
- Lignes = clients
- Colonnes = Food, Drink
- Valeurs = sommes
PIVOT fait partie des clauses standard du Query Language.
Cas 7 — “Renommer et formater pour publier / exporter (LABEL / FORMAT)”
1) LABEL (titres propres)
=QUERY(DATA!A1:H;
"select B, C, H
label B 'Date', C 'Client', H 'Montant'";
1)2) FORMAT (affichage date + montant)
=QUERY(DATA!A1:H;
"select B, C, H
format B 'dd/MM/yyyy', H '##.00'
label B 'Date', H 'Montant'";
1)Cas 8 — “Colonnes calculées (arithmétique + fonctions)”
1) Calcul simple (qty * total) — exemple pédagogique
Imaginons que H soit un prix unitaire (ici ce n’est pas le cas, mais l’exemple illustre la mécanique).
=QUERY(DATA!A1:H;
"select A, C, G, H, G*H
label G*H 'Valeur calculée'";
1)2) Extraire l’année / mois d’une date (fonctions scalaires)
=QUERY(DATA!A1:H;
"select year(B), month(B), count(A)
group by year(B), month(B)
label year(B) 'Année', month(B) 'Mois', count(A) 'Nb commandes'";
1)Cas 9 — “Requête dynamique propre (paramétrée)”
Tu veux éviter les requêtes en dur. Exemple :
REPORT!B1= ville (ex: Lyon)REPORT!B2= montant mini (ex: 10)
=QUERY(DATA!A1:H;
"select A, B, C, D, E, H
where D = '" & B1 & "'
and H >= " & B2 & "
order by H desc";
1)Cas 10 — “Interroger plusieurs onglets / concaténer des sources”
Tu peux concaténer des plages avec des accolades. En FR, on utilise souvent ou ; selon le contexte ; le plus robuste est de tester dans ton fichier car la “locale” impacte la syntaxe d’array literals.
Exemple conceptuel (2 sources empilées) :
=QUERY({DATA!A1:H; DATA_2025!A2:H};
"select * where Col1 is not null";
1)
Pourquoi Col1 et pas A ?
Parce que dès que tu passes par un array {...}, les colonnes deviennent “virtuelles” (Col1, Col2, …). C’est aussi une recommandation fréquente pour les formules évolutives. (Et ça t’évite des délires quand tu changes l’ordre des colonnes.)
Case 11 — “Interroger un autre fichier (IMPORTRANGE + QUERY)”
Pattern classique : importer puis requêter.
=QUERY(
IMPORTRANGE("https://docs.google.com/spreadsheets/d/ID_DU_FICHIER"; "DATA!A1:H");
"select Col3, Col5, Col8 where Col8 >= 20";
1
)6) Tous les “petits” use cases qu’on oublie (et qui font gagner du temps)
6.1) Exclure les vides (is null / is not null)
=QUERY(DATA!A1:H; "select * where A is not null"; 1)6.2) Filtrer sur plusieurs valeurs (OR)
=QUERY(DATA!A1:H; "select * where D='Lyon' or D='Paris'"; 1)6.3) Filtre “liste” via matches
Si tu as une liste de villes dans REPORT!E2:E (ex: Lyon, Paris, Lille), tu peux construire une regex.
Exemple simple (en dur) :
=QUERY(DATA!A1:H; "select * where D matches 'Lyon|Paris|Lille'"; 1)6.4) Faire un “distinct”
Le Query Language ne supporte pas l'opérateur distinct ... workaround :
=UNIQUE(QUERY(DATA!A1:H; "select C"; 1))7) Les erreurs fréquentes (et comment les corriger )
Erreur 1 — “Unable to parse query string…”
Cause typique : guillemets mal fermés, virgule/point-virgule, ou date mal écrite.
✅ Fix : construire la requête étape par étape :
"select *"where
group by
order by
Erreur 2 — Date qui renvoie vide
Tu compares une date Sheets à une date texte. Il faut date 'yyyy-mm-dd'.
Erreur 3 — Types mixtes (nombres en texte)
QUERY ne supporte qu’un type par colonne, déterminé “à la majorité”. Résultat : des valeurs partent en null.
✅ Fix : nettoyer la colonne (VALUE, REGEXREPLACE, SUBSTITUTE) dans une colonne helper, puis requêter la colonne helper.
Erreur 4 — Locale (dates/monnaies) incohérente
Tu changes de fichier / locale, et tout casse.
✅ Fix : vérifier Fichier > Paramètres > Locale (et standardiser). Les forums Google le rappellent souvent sur les cas “inconsistants”.
8) Quand QUERY() est le bon outil… et quand il faut arrêter
QUERY() est parfait pour
- construire des tables de reporting
- agréger vite (sum/avg/count)
- faire des pivots rapides
- alimenter des graphs / Looker Studio
QUERY() est moins adapté pour
- “joins” complexes multi-tables (tu peux le faire, mais tu vas perdre ton âme)
- transformations lourdes ligne à ligne → préfère une colonne helper + fonctions Sheets
- gros volumes : ça peut ramer (selon formule, volatilité, et taille du fichier)
9) Pack d’exercices
Exercice 1 — “Top produits par CA”
Objectif : total par produit, tri décroissant.
=QUERY(DATA!A1:H;
"select E, sum(H)
group by E
order by sum(H) desc
label E 'Produit', sum(H) 'CA'";
1)Exercice 2 — “CA par ville et catégorie (pivot)”
=QUERY(DATA!A1:H;
"select D, sum(H)
group by D
pivot F
label D 'Ville', sum(H) 'CA'";
1)Exercice 3 — “Filtrer par ville + période (paramètres)”
B1 = ville,B2 = date début,B3 = date fin
=QUERY(DATA!A1:H;
"select A, B, C, D, E, H
where D = '" & B1 & "'
and B >= date '" & TEXT(B2;"yyyy-mm-dd") & "'
and B <= date '" & TEXT(B3;"yyyy-mm-dd") & "'
order by B asc";
1)






