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
相关产品推荐
相关产品推荐

