2017-08-01 68 views
1

我按日期执行累计和金订单,但没有得到预期的结果。与用于总和的订单相比,某些记录以不同的顺序呈现。按日期排序的MySQL累计金额

Please have a look at SQL Fiddle

我希望以下两种结果:

2015-05-05T00:00:00Z 50 30 20 90

2015-05-05T00: 00:00Z 60 30 30

2015-05-04T00:00:00Z 70 50 20 30

2015-05-04T00:00:00Z 80 40 40 70

2015-05-03T00 :00:00Z 30 20 10 10

或顺序如下:

2015-05-05T00:00:00Z 60 30 30 120

2015-05-05T00:00:00Z 50 30 20 90

2015-05-05T00:00:00Z 60 30 30 120

2015-05-04T00:00:00Z 80 40 40 70

2015-05-04T00:00:00Z 70 50 20 30

2015-05-04T00:00:00Z 80 40 40 70

2015-05-03T00:00:00Z 30 20 10 10

(增加)请注意负值也是可以的。这就是为什么我在下面提到的答案中提到的一个累积和的命令不能解决问题的原因。作为一个例子,我会稍微修改的结果:

2015-05-05T00:00:00Z 30 60 -30 60

2015-05-05T00:00:00Z 50 30 20 90

2015-05-04T00:00:00Z 80 40 40 70

2015-05-04T00:00:00Z 70 50 20 30

2015-05-03T00:00:00Z 30 20 10 10

感谢您的帮助。

+2

你的数据是不实际订购,因为没有什么有关的日期和时间是唯一的。 –

+0

我同意,有相同日期的行。但是,令我惊讶的是,用于打印结果的顺序(日期为2015-05-04的行)不是用于进行累计和的顺序(最后一列是相邻列的累计和)。 –

回答

0

http://sqlfiddle.com/#!9/7204d4/2 给出您的明确输出..我在查询后添加了@cum:= @cum + tot_earn_pts - tot_redeem_pts asc。

+0

这不是解决问题。它改变了行的顺序,但每行的最后一列不是相邻行的累积和。 –

0

为了通过“cum_liability_pts” DESC添加额外的字段:

SQL Fiddle

SELECT * 
    FROM (
    SELECT date, 
      tot_earn_pts, 
      tot_redeem_pts, 
      tot_earn_pts - tot_redeem_pts AS tot_liability_pts, 
      @cum := @cum + tot_earn_pts - tot_redeem_pts AS cum_liability_pts 
     FROM ( 
     SELECT date, 
       earn_points AS tot_earn_pts, 
       redeem_points AS tot_redeem_pts 
      FROM i_report_total_order 
     /* WHERE website_id = 36 */ 

      ) tots 
     JOIN (SELECT @cum := 0) init 
    ORDER BY date asc 
     ) res_asc 
ORDER BY date desc, cum_liability_pts desc; 
+0

如果由于负值导致累计和减少,这并不能解决问题。 –

+0

您是否删除了累积和为负的行? – jainvikram444

+0

我将在上面添加负值的可能情况。 –