Superset自定义SQL指标列非空判断及实际/目标计算问题求助
Superset「实际/目标」指标计算问题解决
问题场景
在Superset中创建「实际/目标」数据透视表指标,部分TARGET字段值为null,编写的自定义SQL语句无法生效,尝试改为!= Null或!=0后仍无效果。原SQL语句如下:
Case when TARGET is NULL then 0 else SUM(Revenue)*100/Sum(TARGET) END AS [%Actual/Target]
错误原因
原语句存在聚合函数与非聚合字段混用的问题:当使用SUM()这类聚合函数时,查询是基于分组字段做聚合计算的,此时直接引用未聚合的TARGET字段会违反SQL的聚合规则,导致执行异常或结果不符合预期。另外,SQL中判断null必须用IS NULL/IS NOT NULL,!= NULL的写法本身无效,因为null不与任何值相等(包括自身)。
修正后的SQL写法
写法一:先聚合再判断(推荐)
先对TARGET和Revenue做聚合,再判断聚合后的目标值是否为null或0,避免除以0的异常:
CASE WHEN SUM(TARGET) IS NULL OR SUM(TARGET) = 0 THEN 0 ELSE SUM(Revenue) * 100 / SUM(TARGET) END AS [%Actual/Target]
写法二:先处理每行null再聚合
如果需要将每行的null值替换为0后再参与聚合计算:
SUM(Revenue) * 100 / NULLIF(SUM(CASE WHEN TARGET IS NULL THEN 0 ELSE TARGET END), 0) AS [%Actual/Target]
NULLIF(a, b)函数会在a等于b时返回null,这里用来避免当目标总和为0时出现除以0的错误,Superset会自动将null处理为0或空值(可根据需要调整)。
注意事项
- 透视表的自定义指标本质是分组聚合查询,所有字段必须符合聚合逻辑,不能混用聚合函数和原始字段。
- 永远用
IS NULL/IS NOT NULL判断null值,不要用=或!=。
内容的提问来源于stack exchange,提问作者Diem Phuc Tran
相关产品推荐
相关产品推荐

