Brouillon auto

Guide complet Google Sheets QUERY()

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.

Guide complet Google Sheets QUERY()

Sources officielles :

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 (souvent 1)

Erreur classique

  • headers mal réglé → Google invente Col1, 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_idorder_datecustomercityproductcategoryqtytotal
10012025-01-03KarimLyonSandwichFood218.90
10022025-01-03LéaParisSteakFood124.00
10032025-01-04KarimLyonSodaDrink37.50
10042025-01-05NinaLilleSandwichFood19.45
10052025-01-05LéaParisSaladFood216.00
10062025-01-06OmarLyonCoffeeDrink26.20
10072025-01-06NinaLilleSteakFood125.00
10082025-01-07KarimLyonSandwichFood437.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!B1 contient 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 :

  1. "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)
Retour en haut
Formations Analytics