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 .
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))
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:
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.
Vous devez utiliser une approche de type tableau. Comment combiner des tableaux que vous pouvez apprendre ici https://stackoverflow.com/a/42488671/1393023
QUERY
C'est simple et transparent
=QUERY(
ARRAYFORMULA({TEXT(Movements!A:A,"YYYY-MM"),Movements!B:B}),
"select Col1,sum(Col2) group by Col1"
)
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)
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é.