首页 / 资讯中心 / 文章详情

ChatBI 的零与空:不要用一层 COALESCE 改掉业务含义

ChatBI 的零与空:不要用一层 COALESCE 改掉业务含义 ★ FEATURED ARTICLE
“退款率怎么是一条横线能不能改成零”面对这个需求先别改前端。零可能表示有交易但没有退款空值则可能表示没有交易基数也可能是输入缺失。把它们全变成 0%系统不报错了报表却开始误导读者。先约定三种状态下面采用金额口径退款金额除以支付金额。有基数且退款为零结果为零基数为零返回无基数任一金额缺失返回输入缺失。是否允许负数、退款跨期或退款金额超过本期支付额应另有会计规则不能借“防除零”偷偷处理。不同引擎的除零行为也不能混说。DuckDB 1.1.0 的普通浮点除法转向返回infClickHouse 的浮点、整数、Decimal 除法与保护函数有各自语义。函数名和版本必须在目标环境核实。DuckDB 1.1.0 除零语义说明、ClickHouse 算术函数在计算层携带状态from decimal import Decimal def ratio(numerator, denominator): if numerator is None or denominator is None: return {value: None, status: missing_input} n, d Decimal(str(numerator)), Decimal(str(denominator)) if not n.is_finite() or not d.is_finite(): raise ValueError(non-finite amount) if n 0 or d 0: raise ValueError(negative amount needs an explicit business rule) if d 0: return {value: None, status: no_base} return {value: n / d, status: valid} assert ratio(0, 100)[value] 0 assert ratio(0, 0)[status] no_base assert ratio(None, 100)[status] missing_input for case in [(0, 100), (0, 0), (None, 100)]: print(case, ratio(*case))这段代码用十进制数避免把金额输入先转成二进制浮点仍不负责货币换算、财务舍入或跨期归属。教学样本的状态是人为约定不是所有公司的统一标准。把这份约定带到 SQL 和图表若选择无基数返回 NULLSQL 可使用numerator / NULLIF(denominator, 0)但要同时返回基数和质量状态。外层再包COALESCE(...,0)会把区别抹掉。前端可显示“—”提示“该区间无支付基数”缺失输入则提示数据尚未齐全不能与正常零值使用同一个解释。总计要先汇总原始分子分母再求比率。某地区无基数不该参与“地区平均退款率”的简单平均若报告需要宏观平均与加权平均应把两者分别命名。本文只验证标准库函数的三个分支未运行数据库方言和报表组件。完整接入时应该检查 SQL 返回的 NULL、接口 JSON 的 null 和图表空点是否保持一致。健壮性不是把所有错误都藏起来而是让不同情况仍然说不同的话。延伸阅读DuckDB 1.1.0 除零语义说明ClickHouse 算术函数
阅读完成 · 觉得有帮助?
咨询建站