You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MYSQL 查询:查找Amount列总和为指定值的对应行记录

MySQL实现子集和匹配查询

结论

可以实现,该需求属于典型的子集和匹配场景,MySQL 8.0及以上版本可通过递归公共表表达式(CTE)直接完成,低于8.0的版本需要通过存储过程实现,以下是具体实现方案。

示例表结构与测试数据

-- 示例表结构
CREATE TABLE invoices (
    InvoiceNumber VARCHAR(10) NOT NULL,
    Amount DECIMAL(10,2) NOT NULL
);

-- 插入测试数据
INSERT INTO invoices (InvoiceNumber, Amount) VALUES
('INV_1', 135.88),
('INV_2', 87.91),
('INV_3', 99.99),
('INV_4', 421.59),
('INV_5', 39.22);

核心查询语句

WITH RECURSIVE subset_sum AS (
    -- 锚点成员:每一行单独作为初始子集
    SELECT 
        InvoiceNumber AS current_invoices,
        Amount AS total_amount,
        CAST(InvoiceNumber AS CHAR(255)) AS invoice_list,
        1 AS level
    FROM invoices
    UNION ALL
    -- 递归成员:追加未包含的行扩展子集,避免重复计算
    SELECT 
        i.InvoiceNumber,
        ss.total_amount + i.Amount,
        CONCAT(ss.invoice_list, ',', i.InvoiceNumber),
        ss.level + 1
    FROM subset_sum ss
    JOIN invoices i ON i.InvoiceNumber > ss.current_invoices
    WHERE ss.total_amount + i.Amount <= 596.69
)
-- 匹配总金额等于目标值的组合
SELECT invoice_list, total_amount 
FROM subset_sum 
WHERE total_amount = 596.69;

执行后返回结果为INV_1,INV_4,INV_5,总金额为596.69,符合需求。

注意事项

  • Amount字段建议使用DECIMAL类型存储,避免浮点数精度误差导致匹配失败
  • 子集和本身属于NP难问题,数据量大于20行时递归查询性能会急剧下降,该场景建议放到业务代码层处理
  • 语句中i.InvoiceNumber > ss.current_invoices用于去重,避免出现内容相同、顺序不同的重复组合,如需返回所有排列可删除该条件

内容的提问来源于stack exchange,提问作者Skrakle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:36:05