Problème :
Vous souhaitez regrouper vos données par année.
Exemple I :
L'une des colonnes de vos données est transaction_date
. Il contient une date. Vous souhaitez regrouper toutes vos données par année et calculer l'argent total gagné chaque année.
Les data
le tableau ressemble à ceci :
transaction_date | argent |
---|---|
2018-03-25 | 1700 |
2019-09-12 | 100 |
2018-07-14 | 1200 |
2018-01-05 | 400 |
2019-06-08 | 2000 |
2020-03-06 | 1500 |
Solution 1 (afficher l'année et l'argent gagné) :
SELECT EXTRACT(year FROM transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY EXTRACT(year FROM transaction_date);
Le résultat est :
année | argent_gagné |
---|---|
2020 | 1500 |
2019 | 2100 |
2018 | 3300 |
Solution 2 (affichage de la date complète, de l'année et de l'argent gagné l'année correspondante) :
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;
Le résultat est :
transaction_date | année | argent_gagné |
---|---|---|
2018-03-25 | 2018 | 3300 |
2018-07-14 | 2018 | 3300 |
2018-01-05 | 2018 | 3300 |
2019-09-12 | 2019 | 2100 |
2019-06-08 | 2019 | 2100 |
2020-03-06 | 2020 | 1500 |
Discussion :
Dans cet exemple, on suppose que vous n'avez pas l'year
colonne. Au lieu de cela, vous avez la colonne avec les dates complètes.
Tout d'abord, vous devez récupérer une année à partir de la date. Vous pouvez utiliser le EXTRACT(part FROM date)
fonction pour le faire. Dans votre cas, vous souhaitez extraire l'année, donc la part
est year
. La date
est la colonne qui contient les dates – la transaction_date
colonne. C'est une bonne idée de renommer la colonne en année par la suite. Si vous souhaitez en savoir plus sur l'EXTRACT
fonction et comment récupérer différentes parties de la date, vous pouvez le trouver ici.
Si vous souhaitez afficher uniquement l'année et l'argent total gagné cette année-là, vous pouvez utiliser un GROUP BY
. La première colonne sélectionnée est l'année extraite de la date. La deuxième colonne est la fonction d'agrégation SUM(money)
. À la fin de la requête, vous avez besoin d'un GROUP BY EXTRACT(year FROM transaction_date)
ou, plus simple, GROUP BY 1 (since EXTRACT(year FROM transaction_date)
est la première colonne.)
Si vous souhaitez afficher plus de colonnes, vous avez besoin d'une fonction de fenêtre (Solution 2). Après SUM(money)
vous écrivez le OVER()
clause et, puisque vous souhaitez calculer la somme pour chaque année, utilisez PARTITION BY EXTRACT(year FROM transaction_date)
à l'intérieur. Notez que vous n'avez pas encore la colonne année lors du calcul de la somme, donc PARTITION BY year
ne fonctionnera pas - vous obtiendrez une erreur 'column "year" does not exist'
. Vous pouvez en savoir plus sur les fonctions de la fenêtre dans cet article.
Exemple II :
L'une des colonnes de vos données est year
. Vous souhaitez regrouper toutes vos données par cette colonne et calculer le total d'argent gagné chaque année.
Les data
le tableau ressemble à ceci :
année | mois | jour | argent |
---|---|---|---|
2018 | 3 | 25 | 1700 |
2019 | 9 | 12 | 100 |
2018 | 7 | 14 | 1200 |
2018 | 1 | 5 | 400 |
2019 | 6 | 8 | 2000 |
2020 | 3 | 6 | 1500 |
Solution 1 (afficher l'année et l'argent gagné) :
SELECT year, SUM(money) AS money_earned FROM data GROUP BY year;
Le résultat est :
année | argent_gagné |
---|---|
2020 | 1500 |
2018 | 3300 |
2019 | 2100 |
Solution 2 (affichage de l'année, du mois, du jour et de l'argent gagné dans l'année correspondante) :
SELECT year, month, day, SUM(money) OVER(PARTITION BY year) AS money_earned FROM data;
Le résultat est :
année | mois | jour | argent_gagné |
---|---|---|---|
2018 | 3 | 25 | 3300 |
2018 | 7 | 14 | 3300 |
2018 | 1 | 5 | 3300 |
2019 | 9 | 12 | 2100 |
2019 | 6 | 8 | 2100 |
2020 | 3 | 6 | 1500 |
Discussion :
Dans cet exemple, on suppose que vous avez déjà l'year
colonne.
Si vous souhaitez afficher l'année et l'argent total gagné cette année, un simple GROUP BY
est assez. Si vous ne vous sentez pas à l'aise avec le concept de GROUP BY
, jetez un oeil ici où nous l'expliquons. Vous utilisez simplement la fonction d'agrégation (ici :SUM
) avec la bonne colonne et à la fin de la requête vous regroupez par year
. Vous pouvez renommer la colonne en utilisant le AS
mot-clé avec un nouveau nom.
C'est plus compliqué si vous souhaitez également afficher d'autres colonnes. Ensuite, vous avez besoin de la solution en utilisant une fonction de fenêtre (Solution 2). Vous devez utiliser la fonction d'agrégation avec la colonne appropriée (ici :SUM(money)
) et écrivez le OVER()
clause par la suite. Dans cette clause, vous devez utiliser PARTITION BY
avec la colonne par laquelle vous souhaitez grouper. C'est ainsi que vous obtenez :
SUM(money) OVER(PARTITION BY year)
Dans cette solution, vous n'utilisez pas de GROUP BY
clause.
Vous pouvez en savoir plus sur les fonctions de la fenêtre ici.