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

如何对同一Key下的所有值求和?数据库数据聚合结果异常求助

按产品名称累加数量时的问题解决方法

你从数据库提取到的原始数据是这样的:

Product Name Quantity
a 3
a 5
b 2
c 7

预期要得到按产品名称求和的结果:product = {'a':8, 'b':2, 'c':7 },但你用这段代码运行后只得到'a'=5:

for row in result:
    product[row['product_name']] += row['quantity']

问题出在哪?

核心原因是你的字典product里没有预先初始化对应产品名称的键。当第一次循环到a对应的数量3时,product['a']这个键根本不存在,直接用+=操作要么会触发KeyError报错,要么如果你的代码里有错误捕获逻辑跳过了这次操作,就只会累加第二次的5,导致最终a的值是5而不是8。

几种可行的解决方法

方法1:用字典的get()方法安全累加

不需要导入额外模块,每次获取当前键的值,不存在就返回0,再加上当前数量:

product = {}
for row in result:
    prod_name = row['product_name']
    product[prod_name] = product.get(prod_name, 0) + row['quantity']

get()方法的第二个参数是默认值,当键不存在时就用这个值来计算,完美解决初始值的问题。

方法2:用collections.defaultdict简化代码

如果你的项目经常需要处理这类字典累加的场景,defaultdict会让代码更简洁:

from collections import defaultdict

product = defaultdict(int)  # 初始化一个默认值为int类型(默认0)的字典
for row in result:
    product[row['product_name']] += row['quantity']

# 如果需要转换成普通字典(非defaultdict类型),可以这样做:
product = dict(product)

defaultdict(int)会自动给不存在的键设置初始值0,直接用+=就不会有问题。

方法3:直接在数据库层面求和(更高效)

其实最推荐的方式是在SQL查询的时候就完成求和,这样不仅减少Python的计算量,还能减少数据库传输的数据量:

SELECT product_name, SUM(quantity) AS total_quantity
FROM your_table_name
GROUP BY product_name;

这样从数据库拿到的结果直接就是每个产品的总数量,不需要再在Python里循环处理了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:06:00