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)
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.
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. 📊✨
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)⭐ Analytics engineer, Data Analyst et Automatisation IA indépendant ⭐
Ref clients : Logis Hôtel, Yelloh Village, BazarChic, Fédération Football Français, Texdecor…
Mon terrain de jeu :
Data Analyst & Analytics engineering : tracking avancé (GA4, Matomo, Piano, GTM server, Tealium, Commander Act, e-commerce, CAPI, RGPD), entrepôt de données (BigQuery, Snowflake, PostgreSQL, ClickHouse), modèles (Airflow, dbt, Dataform), dashboards décisionnels (Looker, Power BI, Metabase, SQL, Python).
Automatisation IA des taches Data, Marketing, RH, compta etc : conception de workflows intelligents robustes (n8n, App Script, scraping) connectés aux API de vos outils et LLM (OpenAI, Mistral, Claude…).
Engineering IA pour créer des applications et agent IA sur mesure : intégration de LLM (OpenAI, Mistral…), RAG, assistants métier, génération de documents complexes, APIs, backends Node.js/Python.





