Aller au contenu principal

Qu'est-ce que la fonction QUERY ?

Définition
La fonction QUERY interroge une plage de données avec le langage SQL de Google Visualization : filtrer, trier, regrouper et pivoter en une seule formule. Disponible uniquement dans Google Sheets.

QUERY est sans doute la fonction la plus puissante de Google Sheets. Elle te permet d'interroger tes données avec une syntaxe SQL, transformant instantanément ta feuille de calcul en véritable base de données relationnelle. Si tu maîtrises QUERY, tu peux dire adieu aux dizaines de formules imbriquées complexes.

Que tu aies besoin de filtrer des milliers de ventes par région, d'extraire les employés d'un département avec des critères multiples, d'agréger des données financières par catégorie ou de créer des tableaux croisés dynamiques en une seule formule, c'est l'outil indispensable pour tout professionnel manipulant de grands volumes de données dans Google Sheets.

Syntaxe

Clique sur un argument pour aller à son explication.

L'ordre des clauses SQL est obligatoire : SELECT, WHERE, GROUP BY, PIVOT, ORDER BY, LIMIT, LABEL. Le respecter dans un autre ordre provoque une erreur de syntaxe immédiate.

Le conseil du pro
L'ordre des clauses n'est pas libre dans QUERY : tu dois toujours enchaîner SELECT, puis WHERE, GROUP BY, PIVOT, ORDER BY, LIMIT et enfin LABEL. Les écrire dans un autre ordre déclenche une erreur de syntaxe immédiate.
Lucas, la mascotte du Dojo, inspecte les arguments de la fonction à la loupe

Comprendre chaque paramètre de la fonction QUERY

QUERY ne prend que trois arguments : d'abord la plage où vivent tes données, puis ta requête SQL entre guillemets doubles, et enfin le nombre de lignes d'en-tête. Seul ce dernier est facultatif, et c'est lui qui te joue des tours : laissé vide, Google Sheets devine, et il se trompe parfois en prenant ta première ligne de données pour un titre. Fixé à 1, il fait aussi ressortir la ligne d'en-tête dans le résultat, qui compte donc une ligne de plus que le nombre de lignes trouvées.

Le vrai travail se concentre dans le deuxième argument, la requête, qui à elle seule contient tout le filtrage, le tri et les regroupements.

1

données

: la plage de cellules contenant les données à interroger

C'est l'équivalent de la clause FROM en SQL classique. Tu peux utiliser une simple référence de plage comme A1:E100, ou des fonctions plus avancées qui retournent des tableaux.

Google Sheets traite cette plage comme une table de base de données où chaque colonne représente un champ et chaque ligne représente un enregistrement. La première ligne peut contenir des en-têtes selon le paramètre en_têtes, et toutes les lignes suivantes sont considérées comme des données.

2

requête

: la requête SQL à exécuter, entre guillemets doubles

Les colonnes se référencent par leurs lettres (A, B, C...) relatives à ta plage, ou par Col1, Col2, Col3.

Clauses disponibles : SELECT (sélection de colonnes), WHERE (filtrage avec =, !=, >, <, LIKE, CONTAINS...), GROUP BY (regroupement avec SUM, AVG, COUNT, MIN, MAX), ORDER BY (tri ASC ou DESC), PIVOT (tableaux croisés), LIMIT (limiter les résultats), LABEL (renommer les colonnes). Tu peux combiner AND, OR, NOT dans les conditions WHERE.

Attention : Pour les valeurs textuelles à l'intérieur de ta requête, utilise des guillemets simples ' : "SELECT A WHERE B = 'Paris'". La requête est déjà entre guillemets doubles, donc les valeurs texte prennent des guillemets simples.

3

[en_têtes]

: nombre de lignes d'en-tête dans tes données : `-1` pour laisser Google Sheets deviner automatiquement, `0` si aucune ligne d'en-tête, `1` ou plus pour le nombre exact de lignes d'en-têtes. Cet argument ne sert pas seulement à écarter tes titres du calcul, et c'est là que beaucoup se font avoir : avec `1`, la fonction QUERY reprend la ligne d'en-tête dans son résultat(facultatif)

Un filtre qui trouve trois lignes en affiche donc quatre, titres compris, et il faut prévoir cette ligne supplémentaire quand tu réserves la place sous ta formule. Le comportement vaut aussi pour les regroupements et les tableaux croisés, où l'en-tête porte le nom des colonnes calculées.

Si tu ne veux pas de cette ligne de titres dans le résultat, passe en_têtes à 0, mais vérifie alors que la première ligne de ta plage n'est pas un titre qui viendrait polluer tes données.

Lucas, la mascotte du Dojo, fait une démonstration pas à pas de la fonction dans Excel

Exemples pratiques pas à pas

Exemple 1

Comment filtrer un tableau avec la fonction QUERY

Ton responsable veut le détail des ventes du Nord avant la réunion de lundi, et ton fichier empile les quatre régions sur des centaines de lignes. Chaque vente occupe une ligne avec sa région, son vendeur, son montant et sa date, et tu veux en extraire les seules lignes du Nord sur un onglet à part, sans toucher au tableau d'origine. La fonction QUERY interroge ta feuille Google Sheets comme une base de données et te renvoie les lignes voulues d'un coup, dans un tableau qui se met à jour tout seul.

Les étapes
  1. 1
    Dans une cellule, écris =QUERY(.
  2. 2
    En 1er argument : sélectionne la plage où vivent tes données, A1:D7. La ligne de titres est comprise dans la sélection, parce que la fonction QUERY a besoin de voir tes en-têtes pour les reprendre ensuite dans le résultat.
  3. 3
    En 2ᵉ argument : écris la requête SQL entre guillemets doubles, "SELECT B, C, D WHERE A = 'Nord'". La clause SELECT B, C, D ne garde que le vendeur, le montant et la date, et la clause WHERE A = 'Nord' ne laisse passer que les lignes de la région Nord. Les lettres sont relatives à ta plage, donc A désigne la première colonne de A1:D7 et non la colonne A de la feuille. La valeur texte prend des guillemets simples, puisque la requête est déjà entourée de guillemets doubles.
  4. 4
    En 3ᵉ argument : saisis le nombre de lignes de titres, 1. La fonction QUERY reprend alors cette ligne au-dessus de son résultat, qui occupe une ligne de plus que le nombre de ventes trouvées. Laissé vide, l'argument pousse Google Sheets à deviner, et il prend parfois ta première ligne de données pour un en-tête.
  5. 5
    Ferme la parenthèse et appuie sur Entrée.
Au final, ta formule devrait ressembler à ça :=QUERY(A1:D7; "SELECT B, C, D WHERE A = 'Nord'"; 1)
Explication
La fonction lit ta plage comme une table de base de données : SELECT B, C, D ne garde que le vendeur, le montant et la date, et WHERE A = 'Nord' ne laisse passer que les lignes de la région Nord. Attention au troisième argument, c'est le piège classique : en lui donnant la valeur 1, tu annonces une ligne de titres, et la fonction QUERY la recopie en tête de son résultat. Tu obtiens donc quatre lignes au total, la ligne d'en-tête suivie des trois ventes du Nord. Le tout se déverse d'un coup sous la formule, et une nouvelle vente du Nord saisie dans le tableau vient s'y ajouter toute seule.
Exemple 2

Comment trier et limiter les résultats avec la fonction QUERY

Le comité de direction réclame chaque lundi les trois plus grosses commandes réellement encaissées, et ton tableau mélange les commandes payées, en attente et annulées. Tu as une ligne par commande avec son client, son statut, son montant et son canal, et tu veux un classement qui ignore au passage les petites commandes sous 2 000 €. La fonction QUERY sait filtrer, classer et couper la liste en une seule requête, sans que tu touches au tri de la feuille.

Les étapes
  1. 1
    Dans une cellule, écris =QUERY(.
  2. 2
    En 1er argument : sélectionne la plage des commandes, A1:D9. Les huit commandes et leur ligne de titres entrent dans la sélection.
  3. 3
    En 2ᵉ argument : écris la requête entre guillemets doubles, "SELECT A, C, D WHERE B = 'Payée' AND C > 2000 ORDER BY C DESC LIMIT 3". Le SELECT A, C, D n'affiche que le client, le montant et le canal, car la colonne du statut sert à filtrer sans avoir à apparaître. Le WHERE B = 'Payée' AND C > 2000 réclame les deux conditions en même temps grâce à AND, avec des guillemets simples autour du texte 'Payée' et rien autour du nombre 2000. Le ORDER BY C DESC classe ensuite les commandes du montant le plus élevé au plus faible, et le LIMIT 3 arrête le résultat après la troisième. Cinq commandes passent le filtre, seules les trois premières restent.
  4. 4
    En 3ᵉ argument : saisis le nombre de lignes de titres, 1. La fonction QUERY reconnaît ainsi la première ligne comme un en-tête et la repose au-dessus du classement, sans la mêler aux commandes.
  5. 5
    Ferme la parenthèse et appuie sur Entrée.
Voici la formule que tu obtiens à la fin :=QUERY(A1:D9; "SELECT A, C, D WHERE B = 'Payée' AND C > 2000 ORDER BY C DESC LIMIT 3"; 1)
Explication
Ici, la fonction enchaîne trois clauses dans l'ordre imposé : WHERE ne retient que les commandes payées au-dessus de 2 000 €, ORDER BY C DESC les classe du montant le plus élevé au plus faible, et LIMIT 3 coupe après la troisième commande. Cinq commandes passent le filtre, seul le podium s'affiche. La clause LIMIT compte les commandes, pas les titres : comme le troisième argument vaut 1, la ligne d'en-tête se pose au-dessus du podium et le bloc occupe quatre lignes en tout.
Exemple 3

Comment regrouper et totaliser des données avec la fonction QUERY

La clôture du mois approche et on te réclame le total dépensé par catégorie, alors que ta feuille ne contient que des lignes de dépenses au fil de l'eau. Chaque ligne porte une catégorie, un mois et un montant, et tu veux un résumé classé du poste le plus lourd au plus léger, qui se recalcule à chaque nouvelle saisie. La fonction QUERY regroupe les lignes et additionne les montants toute seule, là où il faudrait sinon construire un tableau croisé dynamique à la main.

Les étapes
  1. 1
    Dans une cellule, écris =QUERY(.
  2. 2
    En 1er argument : sélectionne la plage des dépenses, A1:C9. Les huit lignes de dépenses et leur ligne de titres sont dans la sélection.
  3. 3
    En 2ᵉ argument : écris la requête entre guillemets doubles, "SELECT A, SUM(C) GROUP BY A ORDER BY SUM(C) DESC LABEL SUM(C) 'Total'". Le SELECT A, SUM(C) demande la catégorie et la somme de ses dépenses, où SUM écrase plusieurs lignes en une seule valeur. Le GROUP BY A dit sur quoi regrouper, une ligne de résultat par catégorie, et devient obligatoire dès qu'un SELECT mêle une colonne nue et une agrégation. Le ORDER BY SUM(C) DESC fait remonter le poste le plus coûteux en triant sur l'agrégat et non sur la colonne brute qui n'existe plus. Le LABEL SUM(C) 'Total' renomme enfin la colonne calculée, toujours en dernier dans la requête et avec des guillemets simples autour du titre voulu.
  4. 4
    En 3ᵉ argument : saisis le nombre de lignes de titres, 1. La catégorie de la première ligne est ainsi lue comme un titre et non comme une catégorie de dépense de plus.
  5. 5
    Ferme la parenthèse et appuie sur Entrée.
Une fois les morceaux assemblés, ta formule donne ça :=QUERY(A1:C9; "SELECT A, SUM(C) GROUP BY A ORDER BY SUM(C) DESC LABEL SUM(C) 'Total'"; 1)
Explication
La formule ne renvoie plus des lignes du tableau mais un résumé : GROUP BY A fusionne toutes les lignes d'une même catégorie en une seule, et SUM(C) additionne leurs dépenses au passage. Marketing arrive en tête avec 38 000 € cumulés sur trois mois. L'en-tête sort ici aussi, puisque le troisième argument vaut 1 : la première ligne du résultat affiche Catégorie et Total, et les trois catégories viennent en dessous. C'est justement cette ligne que la clause LABEL vient renommer, sans quoi la colonne du total s'intitulerait sum Dépense.
Exemple 4

Comment créer un tableau croisé dynamique avec la fonction QUERY

On te demande le chiffre d'affaires produit par produit et trimestre par trimestre, et ta feuille n'aligne que des lignes de vente à plat. Chaque ligne porte un produit, un trimestre et un montant, et tu veux le classique tableau à double entrée, avec les produits en lignes et les trimestres en colonnes. La fonction QUERY fait ce croisement en une requête, et le tableau se redessine tout seul dès qu'un trimestre s'ajoute.

Les étapes
  1. 1
    Dans une cellule, écris =QUERY(.
  2. 2
    En 1er argument : sélectionne la plage des ventes, A1:C9. Les huit lignes de vente à plat et leur ligne de titres sont comprises.
  3. 3
    En 2ᵉ argument : écris la requête entre guillemets doubles, "SELECT A, SUM(C) GROUP BY A PIVOT B". Le SELECT A, SUM(C) pose le produit en axe des lignes et prépare la somme du chiffre d'affaires qui remplira les cases. Le GROUP BY A donne une ligne par produit, exactement comme pour un résumé classique. Le PIVOT B fait basculer le trimestre à l'horizontale, chaque valeur distincte de la colonne B devenant une colonne du résultat, et se place toujours après GROUP BY.
  4. 4
    En 3ᵉ argument : saisis le nombre de lignes de titres, 1. La ligne de titres reste ainsi un titre et n'entre pas dans le croisement comme un produit de plus.
  5. 5
    Ferme la parenthèse et appuie sur Entrée.
En mettant tout bout à bout, tu écris :=QUERY(A1:C9; "SELECT A, SUM(C) GROUP BY A PIVOT B"; 1)
Explication
La fonction construit une matrice au lieu d'une liste : GROUP BY A pose les produits en lignes, PIVOT B transforme chaque valeur distincte du trimestre en colonne, et SUM(C) remplit chaque croisement. L'ordinateur cumule ainsi 129 000 € en T1 (deux ventes additionnées). Comme dans les exemples précédents, le troisième argument fixé à 1 fait sortir une ligne d'en-tête au-dessus des produits : ce sont ici les valeurs pivotées T1 et T2 qui servent de titres de colonnes. Un T3 saisi dans le tableau source fait apparaître une troisième colonne sans que tu retouches la requête.
Exemple 5

Comment interroger un autre classeur avec les fonctions QUERY et IMPORTRANGE

Chaque boutique tient son propre classeur et on attend de toi un total consolidé, sans que tu passes la semaine à copier-coller des onglets. Les ventes du réseau vivent dans un fichier que l'équipe terrain met à jour chaque jour, avec une ligne par date et par boutique, et tu veux le total par boutique dans ton fichier à toi, toujours à jour. En passant la fonction IMPORTRANGE en source de la fonction QUERY, tu interroges en SQL une feuille qui n'est même pas dans ton classeur.

Le tableau ci-contre est celui du classeur distant, tel que la fonction IMPORTRANGE le rapatrie.

Les étapes
  1. 1
    Dans une cellule, écris =QUERY(.
  2. 2
    En 1er argument : écris à la place d'une plage la fonction IMPORTRANGE refermée, IMPORTRANGE("1AbCdEfGhIjKlMnOpQrStUvWxYz"; "Ventes!A1:C7"). Son premier facteur est l'identifiant du classeur source, la longue chaîne lue dans son URL entre /d/ et /edit, et son second facteur la plage à rapatrier avec son nom de feuille. À la première exécution, Google Sheets renvoie une erreur tant que tu n'as pas cliqué sur Autoriser l'accès pour relier les deux classeurs.
  3. 3
    En 2ᵉ argument : écris la requête entre guillemets doubles, "SELECT Col2, SUM(Col3) GROUP BY Col2 ORDER BY SUM(Col3) DESC LABEL SUM(Col3) 'Total'". Comme la source est une fonction et non une plage de ta feuille, les lettres A, B, C ne fonctionnent plus et les colonnes se nomment Col1, Col2, Col3. Le GROUP BY Col2 réunit chaque boutique sur une seule ligne, le ORDER BY SUM(Col3) DESC place la plus performante en tête, et le LABEL SUM(Col3) 'Total' renomme la colonne agrégée qui s'appellerait sinon sum Ventes.
  4. 4
    En 3ᵉ argument : saisis le nombre de lignes de titres, 1. La ligne de titres du classeur distant est bien un en-tête, et la fonction QUERY doit le savoir pour ne pas la compter comme une vente.
  5. 5
    Ferme la parenthèse et appuie sur Entrée.
La formule complète, c'est celle-ci :=QUERY(IMPORTRANGE("1AbCdEfGhIjKlMnOpQrStUvWxYz"; "Ventes!A1:C7"); "SELECT Col2, SUM(Col3) GROUP BY Col2 ORDER BY SUM(Col3) DESC LABEL SUM(Col3) 'Total'"; 1)
Explication
La fonction IMPORTRANGE rapatrie la plage du classeur voisin, et la fonction QUERY l'interroge comme si elle était sous tes yeux. Le piège se cache dans les noms de colonnes : la source n'est plus une plage de la feuille, donc les lettres ne veulent plus rien dire et il faut passer à Col1, Col2, Col3. Le reste de la requête ne change pas d'un caractère. Le troisième argument garde lui aussi son effet habituel : fixé à 1, il fait ressortir une ligne d'en-tête au-dessus des deux boutiques, avec le titre de la colonne des boutiques et le Total imposé par la clause LABEL.
Lucas, la mascotte du Dojo, l'air gêné face à une erreur Excel

Les erreurs fréquentes avec la fonction QUERY

Presque tout ce qui coince avec QUERY se cache dans la requête elle-même, ce texte entre guillemets que Google Sheets lit comme du SQL. Une valeur texte écrite Paris au lieu de 'Paris', des clauses dans le désordre, un SUM sans son GROUP BY : la moindre coquille fait tout planter.

L'autre famille de problèmes vient des colonnes : leurs lettres sont relatives à ta plage, donc SELECT F sur une plage A1:D100 pointe dans le vide. Et quand le résultat sort vide sans message, c'est presque toujours ton WHERE qui est trop strict ou une casse qui ne colle pas.

La requête retourne un résultat vide

La formule affiche une sortie vide sans erreur. Cela arrive quand ta condition WHERE est trop restrictive, qu'il y a une faute de frappe dans une valeur texte (majuscules/minuscules comptent), ou que les données n'existent tout simplement pas dans la plage.

Solution : Teste d'abord avec "SELECT *" sans WHERE pour vérifier que ta plage de données est correcte. Ajoute ensuite les conditions une par une pour identifier celle qui filtre tout.

Erreur de syntaxe SQL dans la requête

La requête contient un mot-clé mal orthographié, des guillemets manquants ou incorrects, ou les clauses ne sont pas dans le bon ordre (SELECT, WHERE, GROUP BY, PIVOT, ORDER BY, LIMIT, LABEL).

Solution : Vérifie l'ordre obligatoire des clauses et utilise toujours des guillemets simples ' pour les valeurs textuelles à l'intérieur de la requête.

Agrégation sans GROUP BY

Tu utilises une fonction d'agrégation (SUM, AVG, COUNT...) dans ton SELECT avec d'autres colonnes non agrégées, mais sans GROUP BY. En SQL, toutes les colonnes non agrégées doivent figurer dans GROUP BY.

Solution : Ajoute GROUP BY suivi de toutes les colonnes présentes dans SELECT qui ne sont pas dans une fonction d'agrégation : "SELECT A, SUM(B) GROUP BY A".

Colonne inexistante dans la plage

Tu références une colonne qui dépasse les limites de ta plage. Par exemple, tu utilises SELECT F alors que ta plage A1:D100 ne contient que les colonnes A à D. Les lettres sont relatives à la plage, pas à la feuille entière.

Solution : Vérifie que ta plage de données inclut toutes les colonnes référencées. Si ta plage commence en B, alors Col1 correspond à la colonne B, pas A.

Comparaison de types incompatibles

Tu compares des types de données incompatibles : par exemple "WHERE A > 100" alors que la colonne A contient du texte, ou "WHERE B = 'Paris'" alors que B contient des nombres.

Solution : Assure-toi que tes colonnes contiennent le bon type. Utilise des guillemets simples uniquement pour le texte, rien pour les nombres, et le format date '2024-01-15' pour les dates.

Valeurs texte sans guillemets simples

Tu as écrit WHERE A = Paris au lieu de WHERE A = 'Paris'. Sans guillemets simples, Google Sheets interprète Paris comme un nom de colonne ou une variable.

Solution : Encadre toujours les valeurs textuelles avec des guillemets simples ' à l'intérieur de ta requête : "WHERE A = 'Paris' AND B = 'France'".

Lucas, la mascotte du Dojo, compare deux fonctions Excel

QUERY vs FILTRE vs TRIER vs UNIQUE vs SOMME.SI.ENS

Utilise QUERY quand tu dois combiner filtrage, tri, agrégation ou tableaux croisés en une seule formule. Pour des besoins simples, FILTRE ou TRIER peuvent suffire, et ils fonctionnent aussi bien dans Excel.

CritèreQUERYFILTRETRIERUNIQUESOMME.SI.ENS
DisponibilitéGoogle Sheets uniquementExcel + SheetsExcel + SheetsExcel + SheetsExcel + Sheets
Filtrage par conditionOui (WHERE + AND/OR)OuiNonNonOui (jusqu'à 127 critères)
Tri intégréOui (ORDER BY)NonOuiNonNon
Agrégation (SUM, COUNT...)Oui (GROUP BY)NonNonNonOui (résultat unique)
RésultatTableau completTableau filtréTableau triéValeurs dédupliquéesValeur unique
Le combo gagnant
QUERY et IMPORTRANGE forment un duo redoutable : passe IMPORTRANGE en source à la place d'une plage, comme QUERY(IMPORTRANGE("URL"; "Plage"); "SELECT Col1, Col2"), et tu interroges en SQL une feuille qui vit dans un autre classeur.
FAQ

Questions fréquentes

QUERY supporte les principales clauses SQL : SELECT (sélection de colonnes), WHERE (filtrage), ORDER BY (tri), GROUP BY (regroupement), PIVOT (tableaux croisés), LIMIT (limitation de résultats) et LABEL (renommage de colonnes). Tu peux les combiner pour créer des analyses sophistiquées en une seule formule.

Ressources

Pour aller plus loin

Continue sur ta lancée après la fonction QUERY : la leçon associée, un modèle prêt à l'emploi et le guide pour progresser.

Tout voir