google-sheets - 列出日期范围之间的每个月。谷歌查询
问题描述
我正在为一个我一直试图解决几个小时的问题寻求帮助,但徒劳无功。我正在使用谷歌电子表格上的谷歌查询()。所以我有这种表(比如说A1:E3)
客户 | 银行单据 | 开始日期 | 结束日期 | 价值 |
---|---|---|---|---|
约翰 | #1 | 2021 年 10 月 14 日 | 2021 年 10 月 31 日 | 500 |
约翰 | #2 | 2021 年 10 月 14 日 | 2021 年 12 月 31 日 | 500 |
为了更清楚,银行收据是具有开始日期和结束日期的值。因此,银行收据 #2 涵盖了 10 月、11 月和 12 月的 500。我正在尝试做的是一个按时间顺序排列的表(列中有月份),它向我显示了 john 在一年中的银行收据覆盖率,以便获得这种结果:
十月 | 十一月 | 十二月 | ||
---|---|---|---|---|
约翰 | 银行收据 | 1000 | 500 | 500 |
这是更长查询的第一步,但我需要以这种方式返回数据才能继续。
我试图寻找方法来返回每个月的日期范围,但只发现帖子谈论我无法使用的谷歌脚本。我还尝试使用 SEQUENCE() 似乎可以使用一些技巧,直到我从 2021/12/15 到 2022/03/31 并且由于年份的变化它返回了 14。所以我完全没有解决方案。我确切地说我是使用谷歌查询的新手,所以我可能会错过一些明显的事情。
非常感谢谁可以帮助
解决方案
只是一个相当简单的 2 行 X 3 列演示,您可以在其上构建:
=ArrayFormula(mmult({1,1},if((C2:C3<=eomonth(G2,{0,1,2}))*(D2:D3>=eomonth(G2,{0,1,2})),E2:E3,0)))
稍后会给出更完整的解决方案。
这是公式的更动态版本
=ArrayFormula(mmult(sequence(1,counta(A2:A),1,0),
if((C2:index(C:C,counta(C:C))<=eomonth(G2,sequence(1,datedif(G2,H2,"M")+1,0)))*
(D2:index(D:D,counta(D:D))>=eomonth(G2,sequence(1,datedif(G2,H2,"M")+1,0))),E2:index(E:E,counta(E:E)),0)))
但它使用相同的原理
(1) 使用 eomonth 和序列来制作一个单行的月末数组(31/10/21、30/11/21、31/12/21 等)
(2) 将这些日期与数据中的日期范围进行比较,以查看每个范围中包含哪些日期,以及它们匹配的位置,生成一个二维数组,其中包含月份的数量和数据行的下降
(3) 使用 mmult 获取 2d 数组的列总计(这是获取此处显示的列总计的标准方法,用于 Excel 中)
我使用了一个更简单的公式来计算从 I1 开始的月份
=ArrayFormula(edate(G2,sequence(1,datedif(G2,H2,"M"),0)))
推荐阅读
- asp.net - 数据插入成功后将信息打印到另一页
- azure - Azure 映像构建 - azure-arm:无法删除托管映像
- django - 更改通过熊猫创建的 html 表上的列名
- bash - 在 Mac OS 终端中按设定的时间批量更改文件创建日期
- react-native - 从商店响应本机自动更新
- audio - FFmpeg - 音频标签 | 加利西亚语
- azure - 将数据从 Azure 表存储迁移(和转换)到 Cosmos DB Sql API 的最佳方式
- apache-poi - Apache POI docx:HTML 作为带有照片的 altChunk
- powerbi - 使用过滤器从另一个表中获取最小日期
- snowflake-cloud-data-platform - PUT 命令中变量的使用