2015-04-17 120 views
0

嗯,我有一个我无法解决的思维划痕。 总新手:) 我需要计算库存项目的数量和检测负值,如果他们出现在计算:SQL数量计算

inquantity | outquantity 
100  |  0 
10   |  0 
0   |  50 
0   |  100 
20   |  0 
0   |  80 
15   |  0 
100  |  0 

,我需要计算Quty:

inquantity | outquantity | Quty 
100  |  0  | 100 
10   |  0  | 110 
0   |  50  | 60 
0   |  100  | -40 
20   |  0  | -20 
0   |  80  | -100 
15   |  0  | -85 
100  |  0  | 15 

我该怎么办呢?

关于Abhik的帖子:

select 
id , 
inquantity, 
outquantity, 
@qty:= (@qty+inquantity)-outquantity as qty 
from quantity,(select @qty:= 0)r 
order by id; 

有重置上的productid变化的变量@qty的可能性?

+----+-----------+------------+-------------+------+ 
| id | productid | inquantity | outquantity | qty | 
+----+-----------+------------+-------------+------+ 
| 1 |   1 |  100 |   0 | 100 | 
| 2 |   1 |   10 |   0 | 110 | 
| 3 |   1 |   0 |   50 | 60 | 
| 4 |   1 |   0 |   100 | -40 | 
| 5 |   2 |   20 |   0 | 20 | 
| 6 |   2 |   0 |   80 | -60 | 
| 7 |   2 |   15 |   0 | -45 | 
| 8 |   3 |  100 |   0 | 100 | 
+----+-----------+------------+-------------+------+ 
+2

你不能,与数据结构就像它一样。 SQL表格表示*无序*集合。没有固有的顺序,除非你有一个指定顺序的列。你有这个信息的日期或ID吗? –

+0

是的,我有产品ID和这已经是过滤表的输出:SELECT di.inquantity, di.outquantity FROM docfinitem AS二 WHERE di.warehouseid = 7 AND di.productid = 4563 – Nick

+0

包括产品ID在你的例子中! (但是这还不够......你如何知道没有时间戳或交易号码或类似的订单?) – jarlh

回答

2

考虑以下你提到你有id

mysql> select * from quantity ; 
+------+------------+-------------+ 
| id | inquantity | outquantity | 
+------+------------+-------------+ 
| 1 |  100 |   0 | 
| 2 |   10 |   0 | 
| 3 |   0 |   50 | 
| 4 |   0 |   100 | 
| 5 |   20 |   0 | 
| 6 |   0 |   80 | 
| 7 |   15 |   0 | 
| 8 |  100 |   0 | 
+------+------------+-------------+ 

我们可以得到想要的结果作为

select 
id , 
inquantity, 
outquantity, 
@qty:= (@qty+inquantity)-outquantity as qty 
from quantity,(select @qty:= 0)r 
order by id; 

输出将

+------+------------+-------------+------+ 
| id | inquantity | outquantity | qty | 
+------+------------+-------------+------+ 
| 1 |  100 |   0 | 100 | 
| 2 |   10 |   0 | 110 | 
| 3 |   0 |   50 | 60 | 
| 4 |   0 |   100 | -40 | 
| 5 |   20 |   0 | -20 | 
| 6 |   0 |   80 | -100 | 
| 7 |   15 |   0 | -85 | 
| 8 |  100 |   0 | 15 | 
+------+------------+-------------+------+ 
+0

如何在产品更改时重置@qty变量? – Nick

+0

不确定我了解它,提供一些示例数据,并更好地提出一个新问题。 –

0

这个想法是得到累计和。假设您有一个提供订购信息的列,您可以使用子查询或变量来完成此操作。后者应该更高效:

select t.*, (cumei - cumeo) as diff 
from (select t.*, (@i := @i + inquantity) as cumei, 
       (@o := @o + outquantity) as cumeo 
     from table t 
      (select @i := 0, @o := 0) vars 
     order by id 
    ) t 
where (cumei - cumeo) < 0;