Regrouper date par année scolaire [Résolu]

Signaler
Messages postés
144
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
28 août 2020
-
Messages postés
29812
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
23 octobre 2020
-
Bonjour à tous,
J'ai une base de données avec un champ date et un champ prix.

Je voudrais faire une somme des prix en regroupant les dates. Je l'ai fait pour regrouper par mois :
SELECT DATE_FORMAT(Date, '%M %Y') AS Mois, SUM(Prix) AS Ventes FROM boutique_log GROUP BY Mois 

Je voudrais maintenant regrouper par année scolaire (de août inclus à août exclu). Comment faire ça ??

Merci d'avance de votre aide.

2 réponses

Messages postés
29812
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
23 octobre 2020
338
Bonjour,

Là comme ça... ce qui me vient à l'esprit c'est de passer par du CASE
.. En gros dans ton SELECT tu ajoutes des CASE WHEN ... pour chaqune des années scolaires ( ..ça t'oblige à écrire "manuellement" les différentes années scolaires... mais bon... tu n'es pas obligé de créer toutes les possibilités jusqu'en 2050... à mon avis.. tu peux commencer par simplement mettre les 5 dernières (enfin.. tout dépend quand commencent les données que tu as dans ta BDD) et aller sur les 5 prochaines..... soit 10 CASE à écrire).

Un truc du genre :

SELECT   AS Ventes 
     ,CASE 
        WHEN Date BETWEEN CAST ('2012-09-01 00:00:00.000' AS DATETIME) AND CAST ('2013-09-01 00:00:00.000' AS DATETIME) THEN 1 
        WHEN Date BETWEEN CAST ('2013-09-01 00:00:00.000' AS DATETIME) AND CAST ('2014-09-01 00:00:00.000' AS DATETIME)  THEN 2 
        WHEN Date BETWEEN  CAST ('2014-09-01 00:00:00.000' AS DATETIME) AND CAST ('2015-09-01 00:00:00.000' AS DATETIME)  THEN 3 
        ELSE 4 
     END AS AnneeScolaire
FROM boutique_log


Ensuite... tu n'as plus qu'à faire ton Group By sur ce champ...
GROUP BY AnneeScolaire



Messages postés
144
Date d'inscription
dimanche 15 février 2009
Statut
Membre
Dernière intervention
28 août 2020
3
T'as réponse m'a mis sur la voie. J'ai donc fait comme ça :
SELECT IF(DATE_FORMAT(Date, '%c')<8,CONCAT(CAST(DATE_FORMAT(Date, '%Y')-1 AS CHAR),' - ',CAST(DATE_FORMAT(Date, '%Y') AS CHAR)),CONCAT(CAST(DATE_FORMAT(Date, '%Y') AS CHAR),' - ',CAST(DATE_FORMAT(Date, '%Y')+1 AS CHAR))) AS Saison, SUM(Prix) AS Ventes FROM boutique_log GROUP BY Saison


Pour un peu plus d'explications pour des éventuels intéressés :
1/ Je récupère le mois (en numérique) du champs date :
DATE_FORMAT(Date, '%c')

2/ Je teste s'il est inférieur à 8:
IF(DATE_FORMAT(Date, '%c')<8

3/ Si oui, je crée le champ Saison qui concatène (année-1) - année, en prenant soin de convertir l'année en String :
CONCAT(CAST(DATE_FORMAT(Date, '%Y')-1 AS CHAR),' - ',CAST(DATE_FORMAT(Date, '%Y') AS CHAR))

3bis/ Si non, je crée le champ Saison qui concatène année - (année+1)
CONCAT(CAST(DATE_FORMAT(Date, '%Y') AS CHAR),' - ',CAST(DATE_FORMAT(Date, '%Y')+1 AS CHAR))

4/ Et enfin je groupe par ce nouveau champ Saison créé
GROUP BY Saison
Messages postés
29812
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
23 octobre 2020
338
Bonjour,
Si la question est résolue..
Merci de ne pas oublier de clôturer le sujet
(en cliquant sur le lien "Marquer comme résolu" qui se trouve sous le titre de la question)

Cordialement,
Jordane