mysql中累积的公式

时间:2017-09-10 18:52:36

标签: mysql sql

我的数据库中有3个表。在这里看起来如何:

tbl_production:

+--------+------------+-----+-------+  
| id_pro | date       | qty | stock | 
+--------+------------+-----+-------+  
| 1      | 2017-09-09 | 100 |  93   |
| 2      | 2017-09-10 | 100 |  100  |

tbl_out:

+--------+------------+-----+  
| id_out | date       | qty |  
+--------+------------+-----+
| 1      | 2017-09-09 | 50  |  
| 2      | 2017-09-09 | 50  |  
| 3      | 2017-09-10 | 50  |  
| 4      | 2017-09-10 | 50  |

tbl_return:

+--------+------------+-----+  
| id_out | date       | qty |
+--------+------------+-----+
| 1      | 2017-09-09 | 48  |  
| 2      | 2017-09-09 | 50  |  
| 3      | 2017-09-10 | 60  |  
| 4      | 2017-09-10 | 35  |

我想得到当天的股票结果。这应该是表格:

+------------+------+  
| date       | sotd |
+------------+------+
| 2017-09-09 | 98   |  
| 2017-09-09 | 193  |

此结果来自

  

从+ tbl_production.qty前几天累积的股票 -   SUM(tbl_out.qty)GROUP by date + SUM(tbl_return.qty)GROUP by date

2017-09-09日期的库存是0(因为这是第一次生产)+ 100 - 100 + 98 = 98
2017-09-10的日期库存是98(从前几天累积的库存)+ 100 - 100 + 95 = 193

我已经有类似的查询,但无法执行

SET @running_count := 0;
SELECT *,
       @running_count := @running_count + qty - (SELECT SUM(qty) FROM tbl_out GROUP BY date) + (SELECT SUM(qty) FROM tbl_return GROUP BY date) AS Counter 
FROM tbl_production
ORDER BY id_prod;

我怎样才能得到这个结果?

1 个答案:

答案 0 :(得分:1)

在MySQL中,GROUP BY和变量并不总能很好地协同工作。尝试:

SELECT p.date,
       (@qty := @qty + qty) as running_qty
FROM (SELECT p.date, SUM(qty) as qty
      FROM tbl_production p
      GROUP BY p.date
     ) p CROSS JOIN
     (SELECT @qty := 0) params
ORDER BY p.date;

编辑:

如果你想要之前的值,那么表达式有点复杂,但并不难:

SELECT p.date,
       (CASE WHEN (@save_qty := @qty) = NULL THEN -1  -- never happens
             WHEN (@qty := @qty + qty) = NULL THEN -1  -- never happens
             ELSE @save_qty
        END) as start_of_day
FROM (SELECT p.date, SUM(qty) as qty
      FROM tbl_production p
      GROUP BY p.date
     ) p CROSS JOIN
     (SELECT @qty := 0) params
ORDER BY p.date;