我的工作表 Movements 包含两个字段:
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
我希望在另一个工作表 MonthSum 中显示列金额中的数据总和,按列日期的年份+月份:
mydate | amount
2009-01 | 23.00
2009-02 | 75.00
我不想指定电子表格必须总和的单元格,我想要一个通用的公式来按月/年分组我的数据。如果我在MySQL数据库上,我会这样做:
SELECT DATE_FORMAT('%Y-%m', mydate), SUM(amount)
FROM mytable GROUP BY DATE_FORMAT('%Y-%m', mydate)
我需要解决方案才能使用 Google Spreadsheets 。
我认为可能的解决方案是使用SUMIF或数据透视表或Google Spreadsheets QUERY function。
答案 0 :(得分:87)
这是数据透视表的用途。
我已使用您的数据创建了an example。
TEXT(A2, "YYYY-MM")
有关数据透视表的快速概述,请参阅this Google blog post。
答案 1 :(得分:30)
你可以使用数组公式,我把公式放在A2
和A1
中,我把月份数字放在:
=ARRAYFORMULA(SUMPRODUCT(1*(MONTH(Sheet1!$A$2:$A$6)=A1)*Sheet1!$B$2:$B$6))
请参阅doc in action in Google Spreadsheet
[编辑]如果你想要年和月:
=ARRAYFORMULA(SUMPRODUCT(1*(YEAR(Sheet1!$A$2:$A$8)=A2)*(MONTH(Sheet1!$A$2:$A$8)=B2)*Sheet1!$B$2:$B$8))
答案 2 :(得分:11)
除了JMax的贡献, 让我使用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' ")
注意: 我假设原始数据在Sheet3中 而我的结果显示年和月组合yyyy.mm而不是yyyy-mm 我创建了一个插图:
答案 3 :(得分:1)
亚光烧伤和Cœur的答案非常准确,我想添加评论(我没有在评论部分添加它,因为它很长)
您可能希望使用此公式:
DATE(YEAR(A2);MONTH(A2);1)
按年份分组&一个月。
这样您会将值保留为日期,因此可以在数据透视表中应用任何类型的日期格式或排序。
您可以跳过说明:
而不是TEXT(A2, "YYYY-MM")
转换文本中的值,从而消除了有关进一步日期操作的自由。
DATE(YEAR(A2);MONTH(A2);1)
删除该日期的日期和时间,例如 2018/05/03 和 2018/05/06 都成为 2018 / 05/01 这仍然是一个可以归为一组的日期。
直接在数据透视表上应用格式“YYYY-MM”即可获得相同的结果。
答案 4 :(得分:0)
我正在处理类似的问题。我发现这个公式运作良好。
=SUMIF(ARRAYFORMULA(MONTH('Sheet1'!A:A)), A2, 'Sheet1'!B:B)
在单元格A2
中,我将我想要的月份合计。
答案 5 :(得分:0)
您需要使用数组方法。如何合并数组,您可以在这里https://stackoverflow.com/a/42488671/1393023
中学习QUERY
简单而透明
=QUERY(
ARRAYFORMULA({TEXT(Movements!A:A,"YYYY-MM"),Movements!B:B}),
"select Col1,sum(Col2) group by Col1"
)
ARRAYFORMULA(SUMIF)
只需将功能组合到链中
=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)