Database
 sql >> Database >  >> RDS >> Database

Come raggruppare per anno in SQL

Problema:

Vuoi raggruppare i tuoi dati per anno.

Esempio I:

Una delle colonne nei tuoi dati è transaction_date . Contiene una data. Vorresti raggruppare tutti i tuoi dati per anno e calcolare il denaro totale guadagnato ogni anno.

I date la tabella si presenta così:

data_transazione soldi
25-03-2018 1700
12-09-2019 100
14-07-2018 1200
05-01-2018 400
08-06-2019 2000
06-03-2020 1500

Soluzione 1 (visualizzazione dell'anno e del denaro guadagnato):

SELECT
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY EXTRACT(year FROM transaction_date);

Il risultato è:

anno soldi_guadagnati
2020 1500
2019 2100
2018 3300

Soluzione 2 (visualizzando la data completa, l'anno e il denaro guadagnato nell'anno corrispondente):

SELECT
  transaction_date AS transaction_date,
  EXTRACT(year FROM transaction_date) AS year,
  SUM(money) OVER(PARTITION BY EXTRACT(year FROM transaction_date)) AS money_earned
FROM data;

Il risultato è:

anno
data_transazione soldi_guadagnati
25-03-2018 2018 3300
14-07-2018 2018 3300
05-01-2018 2018 3300
12-09-2019 2019 2100
08-06-2019 2019 2100
06-03-2020 2020 1500

Discussione:

In questo esempio si presume che tu non abbia l'year colonna. Invece hai la colonna con le date complete.

Innanzitutto, è necessario recuperare un anno dalla data. Puoi usare EXTRACT(part FROM date) funzione per farlo. Nel tuo caso, vorresti estrarre l'anno, quindi la part è year . La date è la colonna che contiene le date:il transaction_date colonna. È una buona idea rinominare la colonna anno dopo. Se vuoi saperne di più su EXTRACT funzione e come recuperare parti diverse dalla data, lo trovi qui.

Se desideri visualizzare solo l'anno e il totale dei soldi guadagnati in quest'anno, puoi utilizzare un GROUP BY . La prima colonna selezionata è l'anno estratto dalla data. La seconda colonna è la funzione aggregata SUM(money) . Alla fine della query è necessario un GROUP BY EXTRACT(year FROM transaction_date) o, più semplice, GROUP BY 1 (since EXTRACT(year FROM transaction_date) è la prima colonna.)

Se desideri visualizzare più colonne, hai bisogno di una funzione finestra (Soluzione 2). Dopo SUM(money) scrivi OVER() clausola e, poiché desideri calcolare la somma per ogni anno, utilizza PARTITION BY EXTRACT(year FROM transaction_date) dentro. Nota che non hai ancora la colonna dell'anno per il calcolo della somma, quindi PARTITION BY year non funzionerà – riceveresti un errore 'column "year" does not exist' . Puoi leggere di più sulle funzioni della finestra in questo articolo.

Esempio II:

Una delle colonne nei tuoi dati è year . Vorresti raggruppare tutti i tuoi dati in base a questa colonna e calcolare il denaro totale guadagnato ogni anno.

I date la tabella si presenta così:

mese
anno giorno soldi
2018 3 25 1700
2019 9 12 100
2018 7 14 1200
2018 1 5 400
2019 6 8 2000
2020 3 6 1500

Soluzione 1 (visualizzazione dell'anno e del denaro guadagnato):

SELECT
  year,
  SUM(money) AS money_earned
FROM data
GROUP BY year;

Il risultato è:

anno soldi_guadagnati
2020 1500
2018 3300
2019 2100

Soluzione 2 (visualizzazione di anno, mese, giorno e denaro guadagnato nell'anno corrispondente):

SELECT
  year,
  month,
  day,
  SUM(money) OVER(PARTITION BY year) AS money_earned
FROM data;

Il risultato è:

mese
anno giorno soldi_guadagnati
2018 3 25 3300
2018 7 14 3300
2018 1 5 3300
2019 9 12 2100
2019 6 8 2100
2020 3 6 1500

Discussione:

In questo esempio si presume che tu abbia già l'year colonna.

Se desideri visualizzare l'anno e il denaro totale guadagnato in quest'anno, un semplice GROUP BY è abbastanza. Se non ti senti a tuo agio con il concetto di GROUP BY , dai un'occhiata qui dove lo spieghiamo. Usa semplicemente la funzione di aggregazione (qui:SUM ) con la colonna corretta e alla fine della query raggruppi per year . Puoi rinominare la colonna usando AS parola chiave con un nuovo nome.

È più complicato se desideri visualizzare anche altre colonne. Quindi è necessaria la soluzione utilizzando una funzione finestra (Soluzione 2). Dovresti usare la funzione di aggregazione con la colonna appropriata (qui:SUM(money) ) e scrivi OVER() clausola successiva. In questa clausola, dovresti usare PARTITION BY con la colonna in base alla quale desideri raggruppare. Ecco come ottieni:

SUM(money) OVER(PARTITION BY year)

In questa soluzione, non utilizzi un GROUP BY clausola.

Puoi leggere di più sulle funzioni della finestra qui.