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

DuckDB执行SUM查询报错:DECIMAL(7,2)类型转换超出范围

问题解决

错误原因分析

  1. SQL语法逻辑错误:你的查询里SELECT 'client'和group by 'client'中的'client'是字符串常量,而非DataFrame里的client列。这不仅会导致分组逻辑完全偏离预期,还会干扰DuckDB的类型推断流程。
  2. DECIMAL精度溢出:DuckDB默认会把Pandas的浮点列推断为DECIMAL(7,2)类型,但你的数据中存在102188.25这类整数部分占6位的值,聚合后的总和会更大,远超DECIMAL(7,2)的最大值99999.99,因此触发溢出报错。

解决方案

步骤1:修正SQL分组字段

把查询中的字符串常量'client'改为列名client(去掉单引号),确保按client列正确分组:

df_duckdb = duckdb.sql("""
    SELECT client, month, year, SUM(income) AS total_value
    FROM df
    GROUP BY client, month, year
""").to_df()

步骤2:解决DECIMAL溢出问题

有两种可靠处理方式:

方式一:显式转换为高精度DECIMAL

在聚合时将income转换为更大精度的DECIMAL类型,比如DECIMAL(10,2)(支持最大99999999.99的值,完全覆盖你的数据范围):

df_duckdb = duckdb.sql("""
    SELECT client, month, year, SUM(CAST(income AS DECIMAL(10,2))) AS total_value
    FROM df
    GROUP BY client, month, year
""").to_df()

方式二:修改DuckDB全局配置

如果希望全局调整DECIMAL默认精度,避免每次查询手动转换,可设置decimal_precision参数:

import duckdb
# 设置默认DECIMAL精度为10
duckdb.sql("SET decimal_precision = 10;")

# 执行查询
df_duckdb = duckdb.sql("""
    SELECT client, month, year, SUM(income) AS total_value
    FROM df
    GROUP BY client, month, year
""").to_df()

为什么Pandas的groupby正常?

Pandas默认用float64类型处理浮点数值,没有DECIMAL类型的精度范围限制,因此不会触发溢出错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 19:48:11