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 YEAR(transaction_date) AS year, SUM(money) AS money_earned FROM data GROUP BY YEAR(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, YEAR(transaction_date) AS year, SUM(money) OVER(PARTITION BY YEAR(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, il est supposé que vous n'avez pas la colonne année. Vous avez la colonne avec les dates complètes et souhaitez y récupérer l'année.
Pour récupérer une année à partir de la date dans SQL Server, vous pouvez utiliser le YEAR()
une fonction. L'argument de cette fonction doit être une date - ici, la transaction_date
colonne.
Si vous souhaitez afficher l'année et le total d'argent gagné cette année, 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
YEAR(transaction_date)
. D'où la solution 1.
Si vous souhaitez afficher plus de colonnes, vous utilisez une fonction de fenêtre (Solution 2). Après SUM(money)
vous écrivez le OVER()
clause et, puisque vous souhaitez regrouper par année, utilisez PARTITION BY YEAR(transaction_date)
à l'intérieur. Notez que vous n'avez pas encore l'year
colonne lors du comptage de la somme, donc PARTITION BY
année ne fonctionnera pas. Vous pouvez en savoir plus sur les fonctions de la fenêtre ici.
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é 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 uniquement 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 œil 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. De plus, si vous souhaitez que les données soient triées par année, utilisez ORDER BY
année à la fin de votre requête.
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 (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.