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

Come raggruppare per anno in T-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 data 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
  YEAR(transaction_date) AS year,
  SUM(money) AS money_earned
FROM data
GROUP BY YEAR(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,
  YEAR(transaction_date) AS year,
  SUM(money) OVER(PARTITION BY YEAR(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 la colonna dell'anno. Hai la colonna con le date complete e vorresti recuperare l'anno da essa.

Per recuperare un anno dalla data in SQL Server, puoi utilizzare YEAR() funzione. L'argomento di questa funzione dovrebbe essere una data – qui, il transaction_date colonna.

Se desideri visualizzare l'anno e il denaro totale guadagnato 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 YEAR(transaction_date) . Da qui la Soluzione 1.

Se desideri visualizzare più colonne, utilizza una funzione finestra (Soluzione 2). Dopo SUM(money) scrivi OVER() clausola e, poiché desideri raggruppare per anno, utilizza PARTITION BY YEAR(transaction_date) dentro. Nota che non hai ancora l'year colonna durante il conteggio della somma, quindi PARTITION BY l'anno non funzionerà. Puoi leggere di più sulle funzioni della finestra qui.

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 data 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 solo l'anno e il totale dei soldi guadagnati 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. Inoltre, se desideri che i dati siano ordinati per anno, utilizza ORDER BY anno alla fine della tua richiesta.

È 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 (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.