Se utilizzi Google Sheets a livello professionale, probabilmente conosci già molte funzioni integrate: dalle semplici operazioni matematiche ai filtri avanzati. Tuttavia, quando si tratta di analisi dati davvero complesse, la funzione QUERY()
si rivela uno strumento potentissimo, capace di trasformare Google Sheets in una sorta di mini-database relazionale. In questo articolo, disponibile su GoogleSheets.Academy, approfondiremo i molteplici usi della funzione QUERY, mostrando esempi pratici che ti permetteranno di sfruttarne appieno il potenziale.
=== ADS ===

=== ADS ===
Perché la Funzione QUERY è Così Potente?
La funzione QUERY()
consente di applicare istruzioni simili al linguaggio SQL (Structured Query Language) direttamente sui tuoi fogli di calcolo, permettendoti di:
- Filtrare dati con condizioni multiple (AND, OR, IN, LIKE, ecc.)
- Aggregare dati con SUM, COUNT, AVG, MAX, MIN senza dover ricorrere a più funzioni annidate
- Effettuare join logici su tabelle (attraverso range e parametri ben definiti)
- Ordinare e limitare i risultati in modo selettivo
- Combinare più operazioni in una singola formula, evitando colonne di supporto o passaggi intermedi
In pratica, QUERY()
ti permette di eseguire complesse manipolazioni dei dati in un’unica cella, riducendo il rischio di errori e rendendo più semplice la manutenzione del tuo foglio.
Sintassi di Base
La sintassi della funzione QUERY()
è:
=QUERY(dati, query, [intestazione])
- dati: è il range di celle da analizzare, ad esempio
A1:D100
. - query: è una stringa contenente le istruzioni in linguaggio simile a SQL, ad esempio
"SELECT A, B WHERE C > 100 ORDER BY A ASC"
. - intestazione (facoltativo): indica quante righe nel tuo range dati rappresentano intestazioni. Di default è 1, ma può essere impostato a 0 se non ci sono intestazioni.
Un esempio semplice:
=QUERY(A1:C10, "SELECT A, B WHERE C > 50", 1)
Questo estrarrà le colonne A e B delle righe dove la colonna C è maggiore di 50.
Operatori e Condizioni Complesse
Oltre alle condizioni semplici, possiamo usare operatori più sofisticati:
- AND/OR: combinare condizioni multiple.
Esempio:=QUERY(A1:D100, "SELECT A, B, C WHERE B > 100 AND C = 'In Corso'")
Questo selezionerà le righe in cui la colonna B è maggiore di 100 e la colonna C è esattamente “In Corso”.
- IN: filtrare per valori appartenenti a una lista.
Esempio:=QUERY(A1:D100, "SELECT * WHERE A IN ('Milano','Roma','Torino')")
Otterrai tutte le righe in cui la colonna A contiene una di queste tre città.
- LIKE: trovare pattern testuali (simile a una ricerca con wildcard).
Esempio:=QUERY(A1:D100, "SELECT A, B WHERE A LIKE '%inc'")
Mostra tutte le righe in cui la colonna A termina con la sequenza di caratteri “inc” (ad es. “Data Inc” o “Financ Inc”).
- Matches (con espressioni regolari): un livello più avanzato, per pattern complessi.
Esempio:=QUERY(A1:D100, "SELECT * WHERE A MATCHES '^[A-Z]{3}[0-9]{4}$'")
Seleziona le righe in cui la colonna A corrisponde a un pattern di tre lettere maiuscole seguite da quattro cifre (es. “ABC1234”).
Aggregazioni e Funzioni di Gruppo
La potenza della funzione QUERY()
si esprime al massimo quando utilizzi funzioni di aggregazione, simili a quelle di un database SQL:
- SUM, COUNT, AVG, MAX, MIN possono essere utilizzate con
GROUP BY
per creare rapporti aggregati in un solo passaggio.
Esempio: Vendite Aggregate
Supponiamo di avere un elenco di vendite con le seguenti colonne:
Data (A) | Prodotto (B) | Quantità (C) | Prezzo Unitario (D)
Se vuoi sapere il totale delle vendite per ogni prodotto:
=== ADS ===

=== ADS ===
=QUERY(A1:D100, "SELECT B, SUM(C*D) WHERE B IS NOT NULL GROUP BY B ORDER BY SUM(C*D) DESC", 1)
Cosa fa questa query?
SELECT B, SUM(C*D)
seleziona la colonna B (prodotto) e la somma di (quantità * prezzo)WHERE B IS NOT NULL
assicura di ignorare eventuali righe vuoteGROUP BY B
raggruppa i risultati per prodottoORDER BY SUM(C*D) DESC
ordina i prodotti per vendite totali in ordine decrescente
Il risultato sarà una tabella con due colonne: Prodotto e Totale Vendite, ordinata dal prodotto più venduto al meno venduto.
Unire Dati da Tabelle Diverse (Approccio Creativo)
La funzione QUERY()
non esegue vere e proprie join come un database completo, ma possiamo usare un po’ di creatività. Ad esempio, se hai due range di dati sulla stessa scheda o su due fogli diversi, puoi combinare i dati usando funzioni come {}
(l’operatore array-literal) per unire tabelle “verticalmente” o “orizzontalmente” prima di passarle a QUERY()
.
Esempio: Unire Dati da Due Tab a Livello di Query
- Foglio “Gennaio” con dati su vendite di gennaio (A1:D31)
- Foglio “Febbraio” con dati su vendite di febbraio (A1:D28)
Se la struttura delle tabelle è la stessa, puoi unirle verticalmente:
=QUERY({Gennaio!A1:D31; Febbraio!A2:D28}, "SELECT A, SUM(C), SUM(C*D) GROUP BY A ORDER BY SUM(C*D) DESC", 1)
In questo caso:
{Gennaio!A1:D31; Febbraio!A2:D28}
unisce i due range uno sotto l’altro. Per Febbraio partiamo da A2 per non replicare l’intestazione.- La
QUERY()
aggrega i dati provenienti da entrambi i mesi, fornendoti una vista unificata.
Funzioni Data e Manipolazione Avanzata
QUERY()
permette anche di filtrare e raggruppare dati in base a date. Se le colonne contengono dati di tipo Data (formattati correttamente), puoi usare condizioni come WHERE A >= date '2022-01-01' AND A <= date '2022-12-31'
per selezionare un range temporale specifico.
Esempio: Filtrare su Date
=QUERY(A1:D100, "SELECT A, SUM(C) WHERE A >= date '2023-01-01' AND A <= date '2023-12-31' GROUP BY A")
Questo estrarrà, per ciascuna data dell’anno 2023, la somma della colonna C.
Esempio Completo: Dal Dataset all’Insight
Immagina di avere un foglio con migliaia di righe di dati, magari provenienti da un CRM: nomi di clienti, date di acquisto, importi, categorie di prodotti, regione geografica. Il tuo obiettivo è capire:
- Quali categorie di prodotto generano il maggior fatturato?
- Come varia la media di spesa mensile per categoria?
Assumendo che la tua tabella abbia le seguenti colonne:
Data (A) | Cliente (B) | Categoria (C) | Importo (D)
Puoi usare QUERY()
per ottenere un rapporto aggregato mensile per categoria:
=QUERY(A1:D10000, "
SELECT C,
year(A) as Year,
month(A) as Month,
SUM(D) as TotaleVendite,
AVG(D) as SpesaMedia
WHERE A IS NOT NULL
GROUP BY C, year(A), month(A)
ORDER BY year(A), month(A)
", 1)
Questa query:
- year(A), month(A): Estraggono anno e mese dalla data.
- SUM(D), AVG(D): Calcolano totale e media per periodo.
- GROUP BY C, year(A), month(A): Raggruppa i dati per categoria, anno e mese.
- ORDER BY year(A), month(A): Ordina i risultati cronologicamente.
Il risultato è una tabella che per ogni combinazione di categoria e mese dell’anno mostra fatturato totale e spesa media. Da qui puoi facilmente creare un grafico a linee per visualizzare trend nel tempo.
Consigli Pratici e Best Practice
- Nomenclature chiare: Assicurati che le intestazioni siano pulite, senza caratteri speciali o spazi eccessivi. Questo semplifica l’uso delle query.
- Formattazione dati: Le date devono essere riconosciute come tali. Usa il formato corretto (YYYY-MM-DD) o, in caso di dubbi, assicurati di convertire le celle in formato Data.
- Convalida dei dati: Prima di creare query complesse, verifica che i tuoi dati di partenza siano coerenti. Errori di formattazione o celle miste (testo in colonne di numeri) possono generare risultati inaspettati.
- Costruzione graduale: Inizia con query semplici e aggiungi condizioni e aggregazioni step-by-step. In caso di errori, questa tecnica ti aiuterà a identificarli più facilmente.
Conclusioni
La funzione QUERY()
è uno strumento incredibilmente potente per chi lavora con grandi quantità di dati su Google Sheets. Con un approccio simile a SQL, puoi filtrare, raggruppare, ordinare e aggregare i tuoi dati in modo dinamico, trasformando fogli statici in veri e propri cruscotti interattivi e intelligenti.