Qu'est-ce que la fonction QUERY ?
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
=QUERY(données; requête; [en_têtes])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.

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.
données
: la plage de cellules contenant les données à interrogerC'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.
requête
: la requête SQL à exécuter, entre guillemets doublesLes 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.
[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.

Exemples pratiques pas à pas
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.
- 1Dans une cellule, écris
=QUERY(. - 2En 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. - 3En 2ᵉ argument : écris la requête SQL entre guillemets doubles,
"SELECT B, C, D WHERE A = 'Nord'". La clauseSELECT B, C, Dne garde que le vendeur, le montant et la date, et la clauseWHERE A = 'Nord'ne laisse passer que les lignes de la région Nord. Les lettres sont relatives à ta plage, doncAdésigne la première colonne deA1:D7et 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. - 4En 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. - 5Ferme la parenthèse et appuie sur Entrée.
=QUERY(A1:D7; "SELECT B, C, D WHERE A = 'Nord'"; 1)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.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.
- 1Dans une cellule, écris
=QUERY(. - 2En 1er argument : sélectionne la plage des commandes,
A1:D9. Les huit commandes et leur ligne de titres entrent dans la sélection. - 3En 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". LeSELECT A, C, Dn'affiche que le client, le montant et le canal, car la colonne du statut sert à filtrer sans avoir à apparaître. LeWHERE B = 'Payée' AND C > 2000réclame les deux conditions en même temps grâce àAND, avec des guillemets simples autour du texte'Payée'et rien autour du nombre2000. LeORDER BY C DESCclasse ensuite les commandes du montant le plus élevé au plus faible, et leLIMIT 3arrête le résultat après la troisième. Cinq commandes passent le filtre, seules les trois premières restent. - 4En 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. - 5Ferme la parenthèse et appuie sur Entrée.
=QUERY(A1:D9; "SELECT A, C, D WHERE B = 'Payée' AND C > 2000 ORDER BY C DESC LIMIT 3"; 1)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.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.
- 1Dans une cellule, écris
=QUERY(. - 2En 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. - 3En 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'". LeSELECT A, SUM(C)demande la catégorie et la somme de ses dépenses, oùSUMécrase plusieurs lignes en une seule valeur. LeGROUP BY Adit sur quoi regrouper, une ligne de résultat par catégorie, et devient obligatoire dès qu'unSELECTmêle une colonne nue et une agrégation. LeORDER BY SUM(C) DESCfait remonter le poste le plus coûteux en triant sur l'agrégat et non sur la colonne brute qui n'existe plus. LeLABEL 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. - 4En 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. - 5Ferme la parenthèse et appuie sur Entrée.
=QUERY(A1:C9; "SELECT A, SUM(C) GROUP BY A ORDER BY SUM(C) DESC LABEL SUM(C) 'Total'"; 1)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.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.
- 1Dans une cellule, écris
=QUERY(. - 2En 1er argument : sélectionne la plage des ventes,
A1:C9. Les huit lignes de vente à plat et leur ligne de titres sont comprises. - 3En 2ᵉ argument : écris la requête entre guillemets doubles,
"SELECT A, SUM(C) GROUP BY A PIVOT B". LeSELECT A, SUM(C)pose le produit en axe des lignes et prépare la somme du chiffre d'affaires qui remplira les cases. LeGROUP BY Adonne une ligne par produit, exactement comme pour un résumé classique. LePIVOT Bfait basculer le trimestre à l'horizontale, chaque valeur distincte de la colonneBdevenant une colonne du résultat, et se place toujours aprèsGROUP BY. - 4En 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. - 5Ferme la parenthèse et appuie sur Entrée.
=QUERY(A1:C9; "SELECT A, SUM(C) GROUP BY A PIVOT B"; 1)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.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.
- 1Dans une cellule, écris
=QUERY(. - 2En 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é surAutoriser l'accèspour relier les deux classeurs. - 3En 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 lettresA,B,Cne fonctionnent plus et les colonnes se nommentCol1,Col2,Col3. LeGROUP BY Col2réunit chaque boutique sur une seule ligne, leORDER BY SUM(Col3) DESCplace la plus performante en tête, et leLABEL SUM(Col3) 'Total'renomme la colonne agrégée qui s'appellerait sinonsum Ventes. - 4En 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. - 5Ferme la parenthèse et appuie sur Entrée.
=QUERY(IMPORTRANGE("1AbCdEfGhIjKlMnOpQrStUvWxYz"; "Ventes!A1:C7"); "SELECT Col2, SUM(Col3) GROUP BY Col2 ORDER BY SUM(Col3) DESC LABEL SUM(Col3) 'Total'"; 1)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.
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'".

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ère | QUERY | FILTRE | TRIER | UNIQUE | SOMME.SI.ENS |
|---|---|---|---|---|---|
| Disponibilité | Google Sheets uniquement | Excel + Sheets | Excel + Sheets | Excel + Sheets | Excel + Sheets |
| Filtrage par condition | Oui (WHERE + AND/OR) | Oui | Non | Non | Oui (jusqu'à 127 critères) |
| Tri intégré | Oui (ORDER BY) | Non | Oui | Non | Non |
| Agrégation (SUM, COUNT...) | Oui (GROUP BY) | Non | Non | Non | Oui (résultat unique) |
| Résultat | Tableau complet | Tableau filtré | Tableau trié | Valeurs dédupliquées | Valeur unique |
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.
Les colonnes se référencent par leurs lettres (A, B, C...) ou par Col1, Col2, Col3... Tu peux aussi utiliser les en-têtes de colonnes si le paramètre en_têtes est défini sur 1 ou -1.
Attention : les lettres de colonnes sont relatives à ta plage de données, pas à la feuille entière.
Non, QUERY est une fonction exclusive à Google Sheets. Excel propose des alternatives comme les tableaux structurés, Power Query ou les fonctions FILTRER et TRIER pour obtenir des résultats similaires. Si tu travailles sur Excel, combine FILTRE, TRIER et UNIQUE pour des résultats proches.
Oui, tu peux utiliser le résultat d'une QUERY comme source de données pour une autre QUERY. Tu peux aussi combiner QUERY avec d'autres fonctions comme ARRAYFORMULA, IMPORTRANGE, ou utiliser des opérateurs d'ensemble pour fusionner plusieurs requêtes.
Par exemple : =QUERY(QUERY(A1:D100; "SELECT *"); "SELECT * WHERE Col3 > 1000") applique deux filtres successifs.
Parce que le troisième argument vaut 1. En annonçant une ligne de titres, tu demandes aussi à la fonction QUERY de la recopier en tête de son résultat : un filtre qui trouve trois lignes en affiche quatre, la ligne d'en-tête comprise. La règle vaut également pour les regroupements et les tableaux croisés, où cette première ligne porte le nom des colonnes calculées, celui que la clause LABEL permet de choisir.
Si tu préfères un résultat sans titres, par exemple pour empiler plusieurs requêtes les unes sous les autres, passe le troisième argument à 0 et exclus la ligne de titres de ta plage.
Commence par tester une requête simple comme "SELECT *" pour vérifier que ta plage de données est correcte. Ajoute ensuite les clauses une par une : d'abord SELECT avec les colonnes spécifiques, puis WHERE, puis ORDER BY.
Vérifie toujours les guillemets simples pour les valeurs textuelles et les types de données de tes colonnes.
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





