0

这是交易明细表

我正在尝试设计一个 Mysql 库存数据库。我认为每一type: 1行都是一个产品批次(批次)。

type列具有每个事务1的 IN 和0OUT。 detail_id正在引用该id列。

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

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

3 回答 3

1
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;

小提琴

于 2020-03-30T13:53:00.777 回答
0

你可以使用这个:

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 上的演示

于 2020-03-30T13:56:11.817 回答
0

我修改了你的小提琴。我确实对您现有的表更改了一件事 - 您需要指定 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 进行分组来获得指定类型的数量总和,然后使用该结果来计算最终输出。

于 2020-03-30T14:02:56.537 回答