2016-11-14 139 views
0

是否可以使用mysql來獲取累計值給定日期範圍內的總和?將按日期累積的值序列轉換爲非累積值

假設數據是這樣的(是不是需要開始上週六 - 晝列累計星期,就在那裏展現的變化,更容易可視化):

Date  Day   Value 
03/11/2016 Thursday 15 
04/11/2016 Friday  18 
05/11/2016 Saturday  4 
06/11/2016 Sunday  6 
07/11/2016 Monday  8 
08/11/2016 Tuesday  10 
09/11/2016 Wednesday 13 
10/11/2016 Thursday 17 
11/11/2016 Friday  18 
12/11/2016 Saturday  2 
13/11/2016 Sunday  4 
14/11/2016 Monday  6 
and so on... 

因此,例如,如果我問了結果從2016年3月11日到2016年4月11日我期望看到:3(18-15) 從2016/11/11到07/11/2016:(18-15)+4 +(6- 4)+(8-6)= 11

或把它更好上表中應該被變換爲:

Date  Day   Value 
03/11/2016 Thursday  - 
04/11/2016 Friday  3 
05/11/2016 Saturday  4 
06/11/2016 Sunday  2 
07/11/2016 Monday  2 
08/11/2016 Tuesday  2 
09/11/2016 Wednesday 3 
10/11/2016 Thursday  4 
11/11/2016 Friday  1 
12/11/2016 Saturday  2 
13/11/2016 Sunday  2 
14/11/2016 Monday  2 

在PHP或其他語言我只想去像(僞):

If (day != Saturday) {value = currentvalue-yesterdayvalue} else {value = currentvalue) 

理想情況下,我想獲得在MySQL

+0

這一個使用[MySQL用戶變量(HTTP: //dev.mysql.com/doc/refman/5.7/en/user-variables.html)我相信這是可能的。你會使用case語句來檢查星期六並重新初始化變量回到基值。每次之後,您都會將新價值減去基本價值。您可能需要第二個變量來存儲先前記錄的原始值。 – xQbert

+0

根據您的示例,還有一條附加規則:如果當天的值小於前一個值,則按原樣呈現(請參閱05/11/2016的情況)。我對嗎? – FDavidov

+0

這是因爲星期六這些值會被重置,所以無論星期六保持原樣。這些值是一些銷售數據的累計浪費。除了星期六以外,沒有辦法使當天的價值會比昨天的價格低。 –

回答

2
SELECT x.* 
    , CASE WHEN WEEKDAY(x.date) = 5 
      THEN x.value 
      ELSE x.value-y.value END x 
    FROM my_table x 
    LEFT 
    JOIN my_table y 
    ON y.date = x.date - INTERVAL 1 DAY;