web-dev-qa-db-fra.com

Résumer le regroupement par année et par mois

J'ai une feuille de calcul Mouvements avec deux champs:

mydate      | amount
2009-01-01  | 10.00
2009-01-02  | 13.00
2009-02-01  | 11.00
2009-02-05  | 12.00
2009-02-08  | 52.00

Je veux avoir dans une autre feuille de calcul MonthSum qui affiche les sommes des données dans la colonne montant groupées par année + mois de la colonne date:

mydate      | amount
2009-01     | 23.00
2009-02     | 75.00

Je ne veux pas spécifier les cellules où la feuille de calcul doit résumer, je veux une formule générique pour regrouper mes données par mois + année. Si j'étais sur une base de données MySQL, je ferais simplement:

SELECT DATE_FORMAT('%Y-%m', mydate), SUM(amount) 
FROM mytable GROUP BY DATE_FORMAT('%Y-%m', mydate)

J'ai besoin de la solution pour travailler sur Google Spreadsheets

Je pense que les solutions possibles consisteraient à utiliser SUMIF, des tableaux croisés dynamiques ou Google Spreadsheets QUERY function .

41
nulll

Vous pouvez le faire avec une formule matricielle, je mets la formule dans A2 et dans A1, je mets le numéro du mois:

=ARRAYFORMULA(SUMPRODUCT(1*(MONTH(Sheet1!$A$2:$A$6)=A1)*Sheet1!$B$2:$B$6))

Voir le doc en action dans Google Spreadsheet

[EDIT] Si vous voulez l'année et le mois:

=ARRAYFORMULA(SUMPRODUCT(1*(YEAR(Sheet1!$A$2:$A$8)=A2)*(MONTH(Sheet1!$A$2:$A$8)=B2)*Sheet1!$B$2:$B$8))
29
JMax

en plus de la contribution de JMax, permettez-moi de vous présenter la formule suivante à l'aide de la fonction QUERY ...

=query(index('Sheet3'!A:B); "select year(Col1)+(month(Col1)+1)/100,sum(Col2) where Col1 is not null group by year(Col1)+(month(Col1)+1)/100 label year(Col1)+(month(Col1)+1)/100 'mydate',sum(Col2) 'amount' ")

Remarques: J'ai supposé que les données d'origine se trouvaient dans la feuille Sheet3 Et mon résultat présente la combinaison année-mois comme aaaa.mm au lieu de aaaa-mm J'ai créé une illustration:

 yogi

11
Yogi Anand

La réponse de matt burns et de Cœur est assez précise et je voudrais ajouter un commentaire (je ne l'ai pas ajouté dans la section commentaire car elle est assez longue)

Vous pouvez utiliser cette formule à la place: DATE(YEAR(A2);MONTH(A2);1) pour regrouper par année et par mois.

De cette façon, vous conserverez les valeurs sous forme de dates et pourrez donc appliquer tout type de formatage de date ou de tri dans votre tableau croisé dynamique.


Explication que vous pouvez ignorer:

Au lieu de TEXT(A2, "YYYY-MM") convertit la valeur en texte et supprime donc toute liberté quant à la manipulation ultérieure de la date.

DATE(YEAR(A2);MONTH(A2);1) supprime le jour et l'heure de la date pour que, par exemple, 2018/05/03 et 2018/05/06 deviennent tous deux 2018/05/01, qui est toujours une date qui peut alors être regroupés.

En appliquant un format "AAAA-MM" directement sur le tableau croisé dynamique, vous obtenez le même résultat.

1
user1707414

Vous devez utiliser une approche de type tableau. Comment combiner des tableaux que vous pouvez apprendre ici https://stackoverflow.com/a/42488671/1393023

Avant QUERY

C'est simple et transparent

=QUERY(
  ARRAYFORMULA({TEXT(Movements!A:A,"YYYY-MM"),Movements!B:B}),
  "select Col1,sum(Col2) group by Col1"
)

Deuxièmement ARRAYFORMULA(SUMIF)

Il suffit de combiner les fonctions à une chaîne

=SORT(UNIQUE(FILTER(
  {
    TEXT(Movements!A2:A,"YYYY-MM"),
    SUMIF(EOMONTH(Movements!A2:A,1),EOMONTH(Movements!A2:A,1),Movements!B2:B)
  },
  LEN(Movements!B2:B)
)),1,1)

Mon exemple

0
oshliaer

Je travaillais avec un problème similaire. J'ai trouvé cette formule pour bien fonctionner.

=SUMIF(ARRAYFORMULA(MONTH('Sheet1'!A:A)), A2, 'Sheet1'!B:B)

Dans la cellule A2, je mets le mois que je voulais totalisé.

0
kalm42