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 è:
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ì:
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 è:
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.