2016-11-14 113 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;