6
votes

Groupe en mois continu dans des années différentes

J'ai une table (mais à de nombreux endroits):

GROUP BY DATE_FORMAT(DATE, '%Y'), DATE_FORMAT(DATE, '%m') IN (12, 01, 02)


1 commentaires

Créez une colonne artificielle appelée «Année d'affaires» et ajoutez 1 à l'année en cours si le mois est décembre. Vous pouvez ensuite regrouper cela. Il est logique de le faire parce que votre année et votre businessAear sont deux concepts différents (mais liés). Je fais souvent cela pour les clients car ils veulent voir les deux jeux de dates et expose la manière dont le regroupement fonctionne réellement. Ceci est également souvent résolu par l'ajout d'une table supplémentaire - "BusinessMonth" qui mesure des mois sur les quartiers (que vous avez ensuite groupé et commandez par)


5 Réponses :


1
votes

Je suppose un peu ici sur ce que vous voulez vraiment faire avec date_format (date, '% m') dans (12, 01, 02) code>, mais:

SELECT IF(DATE_FORMAT(DATE, '%m') = 12, DATE_FORMAT(DATE, '%Y') + 1, DATE_FORMAT(DATE, '%Y')) AS yr, 
    CASE DATE_FORMAT(DATE, '%m')
        WHEN 12 THEN 1
        WHEN 1 THEN 1
        WHEN 2 THEN 1
        WHEN 3 THEN 2
        WHEN 4 THEN 2
        WHEN 5 THEN 2
        WHEN 6 THEN 3
        WHEN 7 THEN 3
        WHEN 8 THEN 3
        WHEN 9 THEN 4
        WHEN 10 THEN 4
        WHEN 11 THEN 4
    END AS qtr
FROM ...
GROUP BY IF(DATE_FORMAT(DATE, '%m') = 12, DATE_FORMAT(DATE, '%Y') + 1, DATE_FORMAT(DATE, '%Y')), 
    CASE DATE_FORMAT(DATE, '%m')
        WHEN 12 THEN 1
        WHEN 1 THEN 1
        WHEN 2 THEN 1
        WHEN 3 THEN 2
        WHEN 4 THEN 2
        WHEN 5 THEN 2
        WHEN 6 THEN 3
        WHEN 7 THEN 3
        WHEN 8 THEN 3
        WHEN 9 THEN 4
        WHEN 10 THEN 4
        WHEN 11 THEN 4
    END


5 commentaires

+ 1 Battez-moi-moi, bien que personnellement, je mets cela dans la liste de sélection, car il est utile que les utilisateurs voient.


@dash Ouais, j'ai réalisé cela et ajouté la liste de sélection, merci.


C'est loin de "générique" en tant qu'Op demandé, que se passe-t-il si le nouveau groupe d'exige novembre, décembre, janvier ??


@Luissiquot Personnellement, ce serait dans une table (quartier des affaires) et je l'accomplirais via le mois d'origine. Vous pouvez ensuite faire varier le contenu de cette table si votre demande de rapport change.


@Luissiquot J'ai compris que le «générique» de l'OP signifie que cela peut être codé dans la requête SELECT, par opposition à la mise à jour de plusieurs tables avec une nouvelle colonne, mais peut-être que j'avais tort.



0
votes

Je ne pense pas que vous souhaitez utiliser groupe par code> Comment vous essayez de le faire. Vous voudrez probablement écrire vos requêtes comme celle-ci xxx pré>

Le groupe par clause n'est pas l'endroit où vous devriez filtrer / formater vos données. P>

Bien sûr, vous pouvez utiliser Quelle que soit la fonction d'agrégation que vous souhaitez au lieu de la somme. Aussi, vous pouvez omettre la clause WHERE pour toutes les années ou modifier les années à inclure si nécessaire. P>

Si vous voulez année et mois, vous pouvez simplement modifier la requête comme celle-ci: P>

SELECT YEAR(date) as `year`, MONTH(date) as `month`, SUM(stuff) as `sum`
FROM table
WHERE `year` IN ('2010', '2011', 2012')
GROUP BY `year`, `month`


0 commentaires

0
votes

Vous devez soustraire un mois à compter de la date du groupe par:

select DATE_FORMAT(date_add(date_add(DATE,  interval 1 month), interval -1 month), '%Y'),
       DATE_FORMAT(date_add(date_add(date, interval 1 month), interval -1 month), '%m')


0 commentaires

0
votes

J'essaierais quelque chose comme ceci:

GROUP BY DATE_FORMAT(DATE_ADD(`DATE`,INTERVAL IF(MONTH(`DATE`)=12,1,0) YEAR),'%Y')
       , CASE WHEN MONTH(`DATE`) IN (12,1,2) THEN 1
              WHEN MONTH(`DATE`) IN (3,4,5) THEN 2
              WHEN MONTH(`DATE`) IN (6,7,8) THEN 3
              WHEN MONTH(`DATE`) IN (9,10,11) THEN 4
          END


0 commentaires

3
votes
 GROUP BY floor((month(DATE) + year(DATE) * 12 -1 + %month_shift%) / %month_group_period%)
where %month_group_period% is three (3) in your example
and   %month_shift%        is one (1) to obtain december, january, february together, and so onEDIT:  this works for 5 month period too (if you want)

3 commentaires

C'est bon et probablement aussi générique que vous obtenez. Pouvez-vous également ajouter la partie SELECT, indiquant comment calculer l'année et le mois de la période?


@LC, peut être nécessaire pour le retour ou non, la date sera agrégée correctement, mais au cas où le mois est suffisant mois (date), année (date)


@Luissiquot ... Pour une raison quelconque, je ne peux pas obtenir cela pour travailler ... Je reçois les mêmes résultats que j'avais auparavant, où il semble compter sur Dec dans l'année civile qu'il apparaît. C'est ce que j'ai: groupe par date_format (d1.wx_date, '% y'), date_format (d1.wx_date, '% m') dans (plancher (datation_format (d1.wx_date, '% m') + date_format (D1 .Wx_date, '% y') * 12 - 2) * 12/3), - étage (mois + année * 12) - 2) * 12/3) date_format (d1.wx_date, '% m') dans ( 03, 04, 05), date_format (d1.wx_date, '% m') dans (06, 07, 08), date_format (d1.wx_date, '% m') dans (09, 10, 11)