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

MySQL:如何对同一表中两列匹配行的Quantity值求和

搞定MySQL中同表交叉匹配条目的Quantity累加问题

嘿,我明白你现在的困惑了——平时都是简单的单表条件查询,突然遇到要处理同表中两列匹配的条目累加数量,确实有点懵。你一开始想的WHERE Col1 = Col2其实是找同一行里两列相等的情况,这显然不是你要的,咱们换个思路来解决这个问题。

首先得明确核心需求:你应该是想把Col1和Col2互为反向组合的条目(比如一行是(123,234),另一行是(234,123))算作一组,然后把它们的Quantity加起来,对吧?下面给你两种实用的解决方案,你可以根据实际情况选:

方案1:统一组合顺序,分组累加(最通用)

如果不管Col1和Col2的顺序,只要是同一组数值就归为一类,那可以用LEAST()和GREATEST()函数来统一每组的标识,然后分组求和:

SELECT 
    Item,
    LEAST(Col1, Col2) AS Pair_First,
    GREATEST(Col1, Col2) AS Pair_Second,
    SUM(Quantity) AS Total_Quantity
FROM 
    your_table -- 把这里换成你的表名
GROUP BY 
    Item,
    LEAST(Col1, Col2),
    GREATEST(Col1, Col2);

为啥这么写?

  • LEAST(Col1, Col2)会取两列里较小的那个值,GREATEST()取较大的那个,这样不管原来的顺序是(X,Y)还是(Y,X),都会被转换成(小值,大值)的统一格式。
  • 然后按Item和这个统一的组合分组,用SUM(Quantity)就能把同一组的数量加起来了。

比如如果你的表中有(123,234)和(234,123)两行,这个查询就会把它们的Quantity合并成一个总数。

方案2:只累加存在反向匹配的条目

如果你只想保留那些确实有对应反向组合的条目(比如必须存在一行(Y,X)来匹配(X,Y)),那可以用自连接的方式实现:

SELECT 
    t1.Item,
    t1.Col1,
    t1.Col2,
    SUM(t1.Quantity + COALESCE(t2.Quantity, 0)) AS Total_Quantity
FROM 
    your_table t1
LEFT JOIN 
    your_table t2 
    ON t1.Item = t2.Item 
    AND t1.Col1 = t2.Col2 
    AND t1.Col2 = t2.Col1
    AND t1.Col1 < t2.Col1 -- 避免重复计算同一组
GROUP BY 
    t1.Item, t1.Col1, t1.Col2
HAVING 
    COALESCE(t2.Quantity, 0) > 0; -- 只保留有反向匹配的组

解释一下关键点:

  • 自连接自己的表,用t1和t2分别代表两行,匹配条件是同一Item,且t1的Col1等于t2的Col2、t1的Col2等于t2的Col1。
  • t1.Col1 < t2.Col1是为了防止重复统计(比如t1=(123,234)和t2=(234,123),如果不加这个条件,会被统计两次)。
  • COALESCE(t2.Quantity, 0)是为了处理没有反向匹配的情况,避免出现NULL值。
  • HAVING子句用来过滤掉没有对应反向条目的行,只保留真正有匹配的组。

针对你给的示例数据说明

看你提供的示例数据:

Item Quantity Col1 Col2
A 1 123 234
A 3 456 758
A 2 588 258
A 2 234 456

这里面没有互为反向的条目(比如没有(234,123)或者(758,456)这样的行),所以方案2的结果会是空集。而方案1会把每一行作为单独的组,因为它们的Col1和Col2的最小/最大值组合都是唯一的。

如果你的实际需求和我理解的不一样,随时补充具体的匹配规则就行!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:48:11