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

Comment regrouper par année en 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
  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.