计算Excel / Google Spreadsheets中日期范围的总和

时间:2015-02-23 20:11:41

标签: excel google-sheets excel-formula spreadsheet openoffice-calc

我想计算一系列重叠日期的多个值的总和。它应该返回特定年份的总和,并按比例分配超过一年的值。

示例:

╔══════════╦════════════╦════════════╗
║  Value   ║    From    ║     To     ║
╠══════════╬════════════╬════════════╣
║ 100,00 € ║ 01.01.2015 ║ 31.12.2015 ║
║ 150,00 € ║ 01.07.2015 ║ 31.06.2016 ║
║ 300,00 € ║ 01.01.2016 ║ 31.12.2016 ║
╚══════════╩════════════╩════════════╝

2015年预期结果:175,00€ 2016年预计结果:375,00€

我找不到使用SUMIF()SUMIFS()的有效方法。特别是对于重叠日期按比例分割结果。

2 个答案:

答案 0 :(得分:3)

我建议使用辅助列,列标题是计算总数的年份,即2015年和2016年。

我在数据中添加了一行,以确保在时间段不是一整年时它可以正常工作。

重叠区域是两个日期范围的较高端减去两个日期范围的较低端的较小者。如果结果为负,则没有重叠,结果应设置为零。这为从E2开始的每一行产生了以下公式: -

=MAX((MIN(DATE(E$2,12,31),$C3)-MAX(DATE(E$2,1,1),$B3))+1,0)

第一列标题在E2中。

然而,根据问题中给出的数据,这会产生不准确的答案,因为一年中的第二个6个月比第一个更多的天数 6个月。

如果您使用以下公式整月工作,您可以得到一个确切的答案: -

=MAX((MIN(E$2*12+12,YEAR($C3)*12+MONTH($C3))-MAX(E$2*12+1,YEAR($B3)*12+MONTH($B3)))+1,0)

然后计算G3中每个时间段的总重叠: -

=E3+F3

并计算支出的比例作为年份的数量X重叠/ H3中的总重叠: -

 =$A3*E3/$G3    

该方法可以很容易地扩展到任意日期范围,而不仅仅是整年。

几天工作: -

enter image description here

几个月的工作: -

enter image description here

这是一个数组公式(必须使用Ctrl-Shift-Enter输入),它将在一个步骤中进行计算,但似乎相当长。在生产版本中,$ C3:$ C6将被$ C:$ C等替换: -

=SUM(IF(IF(E$2*12+12<YEAR($C3:$C6)*12+MONTH($C3:$C6),E$2*12+12,YEAR($C3:$C6)*12+MONTH($C3:$C6))-IF(E$2*12+1>YEAR($B3:$B6)*12+MONTH($B3:$B6),E$2*12+1,YEAR($B3:$B6)*12+MONTH($B3:$B6))+1>0,IF(E$2*12+12<YEAR($C3:$C6)*12+MONTH($C3:$C6),E$2*12+12,YEAR($C3:$C6)*12+MONTH($C3:$C6))-IF(E$2*12+1>YEAR($B3:$B6)*12+MONTH($B3:$B6),E$2*12+1,YEAR($B3:$B6)*12+MONTH($B3:$B6))+1,0)*$A3:$A6/(YEAR($C3:$C6)*12+MONTH($C3:$C6)-YEAR($B3:$B6)*12-MONTH($B3:$B6)+1))

这两种方法(辅助列和数组公式)会对日期范围产生不同的结果,这些日期范围部分地落在2015年和2016年之外,例如: 1/7 / 14-30 / 6/15将第一种方式全部纳入2015年,但第二种方式只有一半。

答案 1 :(得分:3)

非常感谢你的回答,汤姆。

这就是我最终的目标。

╔═══════╦════════════╦════════════╦══════╦══════╗
║ Value ║    From    ║     To     ║ 2015 ║ 2016 ║
╠═══════╬════════════╬════════════╬══════╬══════╣
║   100 ║ 01.01.2015 ║ 31.12.2015 ║  175 ║  375 ║
║   150 ║ 01.07.2015 ║ 30.06.2016 ║      ║      ║
║   300 ║ 01.01.2016 ║ 31.12.2016 ║      ║      ║
╚═══════╩════════════╩════════════╩══════╩══════╝

使用以下公式:值为A,From为B,To为C

=ArrayFormula(
    SUM(
        IFERROR(
            IF(
                IF(
                    D$1 * 12 + 12 < YEAR($C:$C) * 12 + MONTH($C:$C);
                    D$1 * 12 + 12;
                    YEAR($C:$C) * 12 + MONTH($C:$C)
                )
                - IF(
                        D$1 * 12 + 1 > YEAR($B:$B) * 12 + MONTH($B:$B);
                        D$1 * 12 + 1;
                        YEAR($B:$B) * 12 + MONTH($B:$B)
                ) + 1 > 0;
                IF(
                    D$1 * 12 + 12 < YEAR($C:$C) * 12 + MONTH($C:$C);
                    D$1 * 12 + 12;
                    YEAR($C:$C) * 12 + MONTH($C:$C)
                )
                - IF(
                    D$1 * 12 + 1 > YEAR($B:$B) * 12 + MONTH($B:$B);
                    D$1 * 12 + 1;
                    YEAR($B:$B) * 12 + MONTH($B:$B)
                ) + 1;
                0
            )
            * $A:$A / (
                YEAR($C:$C)
                * 12 + MONTH($C:$C)
                - YEAR($B:$B)
                * 12 - MONTH($B:$B)
                + 1
            )
        ; 0
        )
    )
)

提示:您可以将公式缩进到Google Spreadsheets,以保持其可读性。