Database
 sql >> Base de données >  >> RDS >> Database

Comment regrouper par année dans T-SQL

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.