Агрегировать и вычислять значения в MySQL - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть таблица с некоторыми входящими и исходящими данными.

+====+===========+==========+============+
| id | flow(int) | quantity | product_id |
+====+===========+==========+============+
| 1  | 0         | 100      | 1          |
+----+-----------+----------+------------+
| 2  | 1         | 20       | 1          |
+----+-----------+----------+------------+
| 3  | 1         | 30       | 1          |
+----+-----------+----------+------------+
| 4  | 0         | 10       | 1          |
+----+-----------+----------+------------+
| 5  | 1         | 30       | 2          |
+----+-----------+----------+------------+
| 6  | 2         | 10       | 2          |
+----+-----------+----------+------------+
| 7  | 0         | 10       | 2          |
+====+===========+==========+============+

Поток столбца - это тип enum, 0 - входящий, 1 и 2 - исходящий.

Как узнать текущий «баланс» конкретного продукта?

Продукт 1 должен иметь «баланс» 60 = входящий (100) - исходящий (20) - исходящий (30) + входящий (10).

И Продукт 2 должен иметь -30 «баланс» = исходящий (30) - исходящий (10) - входящий (10).

Можно ли сделать один эффективный способ одним запросом?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Используйте следующее:

SELECT product_id,
       SUM( IF(flow IN ('1','2'), 
               -1*quantity, 
               quantity) ) AS balance
FROM table_name
GROUP BY product_id;
0 голосов
/ 11 сентября 2018
With incoming_product as(
   select product_id,sum(quantity) res
   from my_table
   where flow = 0
   group by product_id
),
outgoing_product as(
   select product_id,sum(quantity) res
   from my_table
   where flow <> 0
   group by product_id
)
select t1.product_id, t1.res - t2.res
from incoming_product t1,outgoing_product t2
where t1.product_id = t2.product_id;
0 голосов
/ 11 сентября 2018

Это будет условное агрегирование:

select product_id,
       sum(case when flow like 'out_%' then - quantity else quantity end) as net_quantity
from t
group by product_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...