Come calcolare il totale dei dati su più tabelle in SQL utilizzando la funzione SUM

In questo articolo, spiegheremo come utilizzare la funzione SUM di SQL per aggregare dati che si estendono su più tabelle. Quando si utilizza un database, è comune dover aggregare dati da più tabelle correlate. Qui, spiegheremo i fondamenti dell’unione delle tabelle, l’uso specifico della funzione SUM e introdurremo tecniche utili per applicazioni pratiche.

Indice

Fondamenti delle unioni di tabelle

Per aggregare dati da più tabelle, è prima necessario unire le tabelle. In SQL, si utilizzano clausole di unione come INNER JOIN o LEFT JOIN per unire le tabelle. Questo permette di ottenere dati correlati come un unico insieme di risultati.

Esempio di utilizzo di INNER JOIN

INNER JOIN unisce i dati in base a una chiave comune presente in entrambe le tabelle. Di seguito è riportato un esempio di unione tra una tabella dei clienti e una tabella degli ordini.

SELECT customers.customer_id, customers.name, orders.order_id, orders.amount
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;

Esempio di utilizzo di LEFT JOIN

LEFT JOIN unisce tutte le righe della tabella a sinistra con le righe corrispondenti della tabella a destra. Se non ci sono corrispondenze, i valori della tabella a destra saranno NULL. Ecco un esempio.

SELECT customers.customer_id, customers.name, orders.order_id, orders.amount
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;

Uso base della funzione SUM

La funzione SUM viene utilizzata per calcolare il totale dei valori di una colonna specificata. È particolarmente utile per aggregare dati numerici. Di seguito viene spiegato l’uso base della funzione SUM.

Esempio di utilizzo della funzione SUM su una singola tabella

Ecco un esempio di base di una query SQL che calcola il totale di una colonna specifica da una singola tabella.

SELECT SUM(amount) AS total_amount
FROM orders;

Questa query calcola il totale di tutti i valori nella colonna amount della tabella orders e restituisce il risultato con l’alias total_amount.

Esempio di utilizzo condizionale della funzione SUM

Per calcolare il totale dei dati che soddisfano una determinata condizione, si utilizza la clausola WHERE. Di seguito è riportato un esempio che calcola il totale degli ordini di un cliente specifico.

SELECT SUM(amount) AS total_amount
FROM orders
WHERE customer_id = 1;

Questa query calcola il totale della colonna amount per tutti gli ordini con customer_id uguale a 1.

Come utilizzare la funzione SUM unendo più tabelle

In questo paragrafo, spiegheremo come unire più tabelle e utilizzare la funzione SUM per aggregare i dati, illustrando un esempio concreto. Questo permette di aggregare dati che si estendono su più tabelle in un unico insieme di risultati.

Esempio di utilizzo della funzione SUM con unione di più tabelle

Di seguito è riportato un esempio che unisce la tabella dei clienti (customers) con la tabella degli ordini (orders) e calcola il totale degli importi degli ordini per ciascun cliente.

SELECT customers.customer_id, customers.name, SUM(orders.amount) AS total_amount
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id
GROUP BY customers.customer_id, customers.name;

Questa query esegue i seguenti passaggi:

  1. Unisce la tabella customers con la tabella orders sulla base di customer_id.
  2. Calcola il totale della colonna orders.amount per ciascun cliente.
  3. Raggruppa i risultati per ID cliente e nome cliente.

Esempio di utilizzo della funzione SUM con LEFT JOIN

Di seguito è riportato un esempio che utilizza LEFT JOIN per mostrare le informazioni sui clienti anche se non hanno ordini, impostando il totale a 0 in questi casi.

SELECT customers.customer_id, customers.name, COALESCE(SUM(orders.amount), 0) AS total_amount
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
GROUP BY customers.customer_id, customers.name;

Questa query esegue i seguenti passaggi:

  1. Unisce tutte le righe della tabella customers con le righe corrispondenti della tabella orders.
  2. Se non ci sono corrispondenze, utilizza la funzione COALESCE per impostare il totale a 0.
  3. Raggruppa i risultati per ID cliente e nome cliente.

Applicazioni avanzate di raggruppamento e aggregazione

In questo paragrafo, spiegheremo come utilizzare la clausola GROUP BY per raggruppare i dati in base a condizioni specifiche e aggregarli con la funzione SUM. Questo permette di aggregare i dati in base a categorie o condizioni specifiche.

Esempio di calcolo del totale per categoria

Di seguito è riportato un esempio che unisce la tabella dei prodotti (products) con la tabella delle categorie (categories) e con la tabella dei dettagli degli ordini (order_details), calcolando il totale delle vendite per categoria.

SELECT categories.category_name, SUM(order_details.quantity * order_details.unit_price) AS total_sales
FROM products
INNER JOIN categories ON products.category_id = categories.category_id
INNER JOIN order_details ON products.product_id = order_details.product_id
GROUP BY categories.category_name;

Questa query esegue i seguenti passaggi:

  1. Unisce la tabella products con la tabella categories sulla base di category_id.
  2. Unisce la tabella products con la tabella order_details sulla base di product_id.
  3. Calcola il totale delle vendite per categoria (quantità × prezzo unitario).
  4. Raggruppa i risultati per nome della categoria.

Esempio di calcolo del totale per periodo

Di seguito è riportato un esempio che calcola il totale degli ordini per mese dalla tabella degli ordini (orders).

SELECT DATE_FORMAT(order_date, '%Y-%m') AS order_month, SUM(amount) AS total_amount
FROM orders
GROUP BY order_month;

Questa query esegue i seguenti passaggi:

  1. Formatta order_date per ottenere anno e mese.
  2. Calcola il totale degli ordini per ogni mese.
  3. Raggruppa i risultati per mese.

Raggruppamento e aggregazione condizionale

Per raggruppare e aggregare i dati che soddisfano condizioni specifiche, si utilizza la clausola WHERE. Di seguito è riportato un esempio che calcola il totale degli ordini per i clienti di una specifica regione.

SELECT customers.region, SUM(orders.amount) AS total_amount
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id
WHERE customers.region = 'North'
GROUP BY customers.region;

Questa query esegue i seguenti passaggi:

  1. Unisce la tabella customers con la tabella orders sulla base di customer_id.
  2. Filtra i clienti la cui region è ‘North’.
  3. Calcola il totale degli ordini per ogni regione.

Ottimizzazione delle prestazioni

Per aggregare grandi quantità di dati in modo efficiente, è importante ottimizzare le prestazioni delle query SQL. In questa sezione, spiegheremo alcune tecniche per migliorare le prestazioni e come utilizzare gli indici.

Utilizzo degli indici

Gli indici vengono utilizzati per migliorare la velocità di ricerca nelle tabelle. È particolarmente efficace impostare indici sulle colonne utilizzate nelle condizioni di unione o di aggregazione. Di seguito è riportato un esempio di come impostare un indice su customer_id.

CREATE INDEX idx_customer_id ON orders(customer_id);

Questo indice accelera le operazioni di unione basate su customer_id.

Utilizzo delle subquery

Utilizzare subquery per calcolare i risultati intermedi può migliorare le prestazioni della query complessiva. Di seguito è riportato un esempio che utilizza una subquery.

SELECT customer_id, SUM(amount) AS total_amount
FROM (
    SELECT customer_id, amount
    FROM orders
    WHERE order_date >= '2023-01-01' AND order_date <= '2023-12-31'
) AS filtered_orders
GROUP BY customer_id;

Questa query filtra prima gli ordini per il periodo specificato, quindi calcola il totale per ogni cliente.

Creazione di tabelle dedicate all’aggregazione

Creare tabelle dedicate a conservare i risultati di aggregazioni frequenti e aggiornarle periodicamente può migliorare le prestazioni. Di seguito è riportato un esempio di creazione di una tabella di aggregazione e inserimento dei dati.

CREATE TABLE customer_order_totals (
    customer_id INT,
    total_amount DECIMAL(10, 2)
);

INSERT INTO customer_order_totals (customer_id, total_amount)
SELECT customer_id, SUM(amount)
FROM orders
GROUP BY customer_id;

Con questo metodo, le query di aggregazione frequenti possono essere eseguite più velocemente.

Utilizzo di tipi di dati appropriati

La scelta del tipo di dati influisce anche sulle prestazioni. Selezionare tipi di dati appropriati senza utilizzare quelli più grandi del necessario può migliorare le prestazioni.

Conclusione

In questo articolo, abbiamo appreso come aggregare dati che si estendono su più tabelle utilizzando la funzione SUM in SQL. Abbiamo esaminato i fondamenti dell’unione delle tabelle, l’uso base della funzione SUM, come utilizzare SUM unendo più tabelle, applicazioni avanzate di raggruppamento e aggregazione, e ottimizzazione delle prestazioni. Utilizzando queste conoscenze, sarai in grado di eseguire operazioni complesse su database in modo efficiente.

Indice