Как рассчитать количество под рукой для каждого лота (mysql) - PullRequest
0 голосов
/ 30 марта 2020

Это таблица подробностей транзакции

Я пытаюсь создать базу данных инвентаризации Mysql. Я считаю каждую type: 1 строку партией продукта (партии).

В столбце type есть 1 для IN и 0 для OUT для каждой транзакции. detail_id ссылается на столбец id.

Как получить этот результат:

 id   item  sum(quantity)
  1     1         3            [10-(5+2)]
  4     1         0            (5-5)
  6     2         20            20

Ответы [ 3 ]

1 голос
/ 30 марта 2020
WITH cte AS (
  SELECT *, 
         SUM(detail_id IS NULL) OVER (PARTITION BY item ORDER BY id) group_num 
  FROM details
)
SELECT MIN(id) id,
       item,
       SUM( CASE type WHEN 1 THEN quantity 
                      WHEN 0 THEN -quantity 
                      END ) `sum(quantity)`
FROM cte
GROUP BY item, group_num;

скрипка

0 голосов
/ 30 марта 2020

Я изменил вашу скрипку . Я изменил один подход к вашей существующей таблице, вам нужно указать detail_id, где бы он ни был, чтобы мы могли сгруппировать результат по этому.

Окончательный запрос будет выглядеть следующим образом:

select detail_id, item, 
(in_sum - out_sum) as `sum(quantity)` from
(SELECT
detail_id,
item,
sum(case when type=1 then quantity else 0 end) as in_sum,
sum(case when type=0 then quantity else 0 end) as out_sum
FROM details
group by detail_id, item) tab

Сначала получите сумму количества для указанного типа, сгруппировав его по detail_id, item, а затем используйте этот результат для вычисления окончательного результата.

0 голосов
/ 30 марта 2020

Вы можете использовать это:

SELECT 
  lots.id,
  MIN(lots.item) AS item,
  MIN(lots.quantity) - IFNULL(SUM(details.quantity), 0) AS quantity 
FROM (
  SELECT id, item, quantity 
  FROM details
  WHERE type = 1
) lots LEFT JOIN details ON lots.id = details.detail_id 
GROUP BY lots.id
ORDER BY lots.id

демо на dbfiddle.uk

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...