1

我想計算一系列重疊日期的多個值的總和。它應該返回特定年份的總和,並按比例分解超過一年的值。在Excel/Google Spreadsheets中計算日期範圍的總和

例子:

╔══════════╦════════════╦════════════╗ 
║ 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€

餘did't發現使用SUMIF()或有效的方法SUMIFS()。特別是對於重疊日期按比例分割結果。

+0

1.這是否需要在Excel和表格中都可以使用,或者它們可以是其中一種嗎? 2.你能解釋爲什麼它不應該超過175歐元,略低於375歐元,因爲150歐元的金額包括2015年的7個月和2016年的5個月。 – AdamL 2015-02-23 22:27:01

+0

@AdmL對不起,你當然是對的。我已經確定了日期範圍。它應該在谷歌電子表格(在我的情況)。我已經添加了其他工具,因爲我認爲解決這個任務可能有相似之處。 – awenro 2015-02-24 07:47:31

+0

我已經草擬了一個答案,但如果你在幾天內工作,你不會得到確切的結果。你能否假設你會一直工作整個月? – 2015-02-24 12:09:53

回答

3

我建議使用輔助列,與列標題被分配爲總計將2015年,即至2016年

來計算這些年來我增加了一個額外行的數據,以確保它在時間不是一整年的情況下工作。

重疊區域是兩個日期範圍的較高端減去兩個日期範圍較低端的較小者。如果結果是否定的,則不存在重疊,結果應該設置爲零。這爲從E2開始的每一行產生以下公式: -

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

其中第一列標題在E2中。

但是,使用問題中提供的數據,這會產生一個不精確的答案,因爲在一年中的第二個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  

該方法可以很容易地擴展到任意日期範圍,而不僅僅是整年。 (必須用Ctrl-Shift鍵,回車進入)

enter image description here

這裏是一個數組公式,這將 - :

工作的天數: -

enter image description here

工作幾個月一步完成計算,但似乎相當長。在生產版本,$ 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年的全部數額作爲第一種方式,但只有一半是第二種方式。

+0

是的,目前只有整個月是相關的。這是關於記錄運營成本/水電費帳單。 謝謝你的建議,湯姆。但是我們希望避免使用助手列,因爲表將會增長,並且最終會有很多助手,這需要維護。 你有沒有幫助者列的解決方案的想法? – awenro 2015-02-25 07:35:38

+0

我會考慮一下。同時,我需要編輯這個版本,因爲如果From-To時間間隔是(例如)9個月,一年6個月,另一個3年,那麼它將不起作用。 – 2015-02-25 07:57:36

+0

是的,它可以在單個(數組)公式中完成,但似乎相當長。我會將其添加到我的答案中。 – 2015-02-26 10:22:05

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 ║  ║  ║ 
╚═══════╩════════════╩════════════╩══════╩══════╝ 

使用下列公式推爲值是,從爲B,要爲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 
     ) 
    ) 
) 

提示:您可以發佈縮進到谷歌電子表格的公式推,以保持它的可讀性。

+1

有用的提示!非常感謝您的反饋@awenro。 – 2015-02-26 15:56:54