如何获取单个整数/浮点列的总和达到某个值的行

Posted

技术标签:

【中文标题】如何获取单个整数/浮点列的总和达到某个值的行【英文标题】:How to fetch rows from which sum of a single integer/float column sums upto a certain value 【发布时间】:2020-04-16 13:29:23 【问题描述】:

我有一张桌子。它具有以下结构

goods_receiving_items

身份证 item_id 数量 created_at

我正在尝试获取符合以下条件的行

有一个 item_id

当数量列之和等于某个值时

所以例如我有以下数据

+----+---------+----------+------------+
| id | item_id | quantity | created_at |
+----+---------+----------+------------+
|  1 |       2 |       11 | 2019-10-10 |
|  2 |       3 |      110 | 2019-10-11 |
|  3 |       2 |       20 | 2019-11-09 |
|  4 |       2 |        5 | 2019-11-10 |
|  5 |       2 |        1 | 2019-11-11 |
+----+---------+----------+------------+

我尝试了以下查询:

SET @sum:= 0;
SELECT   item_id, created_at, (@sum:= @sum + quantity) AS SUM, quantity 
FROM     goods_receiving_items
WHERE    item_id = 2 AND @sum<= 6
ORDER BY created_at DESC

如果我不使用ORDER BY,那么查询将给我 ID '1'。但是如果我使用ORDER BY,它将返回所有带有item_id = 2 的行。

应按此顺序仅返回 ID '5' 和 '4'

我似乎无法解决这个问题,ORDER BY 对我的任务至关重要。 任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

您应该在结果集上使用 order by 你可以使用子查询来做到这一点

  SET @sum:= 0;

  select t.* 
  from t (
    SELECT item_id
        , created_at
        , (@sum:= @sum + quantity) as sum
        , quantity 
    FROM goods_receiving_items
    WHERE item_id = 2 AND @sum<= 6
  ) t
  ORDER BY created_at DESC

【讨论】:

这只是在达到总和后对结果进行排序。我需要的是从最新的行开始计算总和,即具有最大的“created_at”值【参考方案2】:

您应该尝试使用INNER JOINSELECT min(created_at)SELECT max(created_at)

来自 mysql 文档:

...从每个组中选择的值不会受到影响 添加 ORDER BY 子句。结果集的排序发生在 值已被选择,并且 ORDER BY 不会影响哪个值 服务器选择。

以下问题的答案可能会有所帮助:MYSQL GROUP BY and ORDER BY not working together as expected

【讨论】:

这不只是从表中获取一个值吗?【参考方案3】:

四处搜索后,我提出了以下查询

SELECT 
t.id, t.quantity, t.created_at, t.sum
      FROM 
       ( SELECT 
          *,
          @bal := @bal + quantity AS sum,
          IF(@bal >= $search_number, @doneHere := @doneHere + 1 , @doneHere) AS whereToStop
            FROM goods_receiving_items
            CROSS JOIN (SELECT @bal := 0.0 , @doneHere := 0) var
            WHERE item_id = $item_id
            ORDER BY created_at DESC) AS t
                    WHERE t.whereToStop <= 1
                    ORDER BY t.created_at ASC

在上述查询中,$search_number 是一个变量,用于保存必须达到的值。 $item_id 是我们正在搜索的项目。

这将返回 quantity 列的总和构成所需总和的所有行。总和将由 created_at 以降序排列的行进行,然后将按升序重新排列。

当库存管理系统中使用一定数量的物品时,我使用此查询来计算成本;所以这可能会帮助其他人做同样的事情。我在 *** 上从另一个 question 获取了大部分查询

【讨论】:

以上是关于如何获取单个整数/浮点列的总和达到某个值的行的主要内容,如果未能解决你的问题,请参考以下文章

如何从此查询中获取“temp”列值的总和?

PostgreSQL - 如何在单个查询中获取列的最小值和最大值以及与它们关联的行?

需要 SQL 来选择行,直到列的总和达到最后一行不会完全消耗值的值

MySQL的聚合函数

MySQL的聚合函数

165 - 获取单个表格的行数据