2015-04-20 4 views
0
SELECT * FROM quantity; 
+----+-----------+------------+-------------+ 
| id | productid | inquantity | outquantity | 
+----+-----------+------------+-------------+ 
| 1 |   1 |  100 |   0 | 
| 2 |   1 |   10 |   0 | 
| 3 |   1 |   0 |   50 | 
| 4 |   1 |   0 |   100 | 
| 5 |   2 |  200 |   0 | 
| 6 |   2 |   0 |   200 | 
| 7 |   2 |   15 |   0 | 
| 8 |   3 |  100 |   0 | 
| 9 |   3 |   50 |   0 | 
| 10 |   3 |   0 |   5 | 
+----+-----------+------------+-------------+ 

рассчитать количество для конкретного продукта я сделать этоSQL сбросить значение переменной, если идентификатор изменения

SELECT 
id , productid, 
inquantity, 
outquantity, 
@qty:= (@qty+inquantity)-outquantity as qty 
from quantity,(select @qty:= 0)r 
WHERE productid=1; 
+----+-----------+------------+-------------+-----+ 
| 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 | 
+----+-----------+------------+-------------+-----+ 

Можно ли вычислить это для всех PRODUCTID-х годов? Как сбросить переменную @qty для начала с 0, если productid отличается от частного?

Чтобы получить это:

+----+-----------+------------+-------------+-----+ 
| 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 |  200 |   0 | 200 | 
| 6 |   2 |   0 |   200 | 0 | 
| 7 |   2 |   15 |   0 | 15 | 
| 8 |   3 |  100 |   0 | 100 | 
| 9 |   3 |   50 |   0 | 150 | 
| 10 |   3 |   0 |   5 | 145 | 
+----+-----------+------------+-------------+-----+ 

ответ

0

вы можете использовать case заявление и другую переменную для проверки идентификатора же продукта

SELECT 
id , productid, 
inquantity, 
outquantity, 
@qty := case when @g = productid then @qty else 0 end, 
@qty:= (@qty+inquantity)-outquantity as qty , 
@g := productid 
from quantity, 
(select @qty:= 0 ,@g=null)r 
order by productid 

DEMO

0

Я думаю

| 7 | 2 | 15 | 0 | -15 |

кол-во будет 15 не -15

И вы можете получить результат как

select 
id, 
productid, 
inquantity, 
outquantity, 
qty from (
SELECT 
id , 
productid, 
inquantity, 
outquantity, 
@qty:= if(@prev_prod = productid, ((@qty+inquantity)-outquantity),(inquantity-outquantity)) as qty, 
@prev_prod:= productid 
from quantity,(select @qty:= 0,@prev_prod:=0)r 
order by productid,id 
)x; 
Смежные вопросы