【问题标题】:How to calculate quantity on hand for every lot (mysql)如何计算每批次的手头数量(mysql)
【发布时间】:2020-07-10 21:18:19
【问题描述】:

这是transaction details table

我正在尝试设计一个 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

【问题讨论】:

  • 哪个属性设置了具有相同item 的组中的记录顺序? “位置排序”是错误的答案...id 可以是这个属性吗?

标签: mysql sql database product-quantity


【解决方案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;

fiddle

【讨论】:

  • 你的答案和@Sebastian Brosch 的你认为最好的是什么?
  • @grimdbx 测试真实数据数组。调查执行计划。创建适当的索引。没有人可以回答没有源信息更好......
【解决方案2】:

你可以用这个:

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

demo on dbfiddle.uk

【讨论】:

  • 请用更新的源数据解释您在fiddle 上的查询结果。
  • 您再次添加了前 3 行,其中第 2 行和第 3 行的 detail_id 引用了第一行 (id 1),因此演算为 10-(5+2+5+2)= -4.
【解决方案3】:

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

【讨论】:

  • 我必须对 IN 行进行额外更新才能插入自动递增的 ID。
  • 没有它你如何识别匹配的detail_id?
  • 查看@Akina 上面的回答。
猜你喜欢
  • 2021-06-19
  • 2017-05-08
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多