OBIEE中AVERAGE计算异常及表达式问题咨询
你的表达式问题分析与解决方案
首先,你的表达式语法上没有错误,但逻辑和你期望的呈现效果不匹配,才会出现“选十一月只显示第一列、选十二月只显示第二列”的情况——核心原因是你的提示参数应该是用来过滤整个数据集(即报表只返回选中月份的数据),这时候:
- 当你选Nov时,数据集里只有Nov的记录,第二列的
CASE WHEN month = 'Dec'永远不成立,所以返回NULL,看起来就像只显示十一月的数据; - 选Dec时同理,第一列返回NULL,只显示十二月的数据。
接下来根据你的实际需求,给你几种调整方案:
方案1:只显示选中月份的平均值(单列展示)
如果你本来就希望选哪个月份就只展示该月份的平均成绩,完全不需要分两列写CASE。直接用下面的表达式即可(前提是提示参数已经过滤了对应月份的数据):
AVG(Marks by Student)
这样报表只会显示一列平均值,简洁又符合需求。
方案2:同时显示Nov和Dec的平均值(不受提示参数影响)
如果你的需求是不管选哪个提示参数(比如其他维度的过滤),都要同时展示十一月和十二月的平均成绩,那首先要确保报表数据集没有被提示参数过滤月份(保留Nov和Dec的所有数据),然后用窗口函数来计算整体平均值:
- 第一列(十一月平均):
AVG(CASE WHEN month = 'Nov' THEN Marks by Student END) OVER ()
- 第二列(十二月平均):
AVG(CASE WHEN month = 'Dec' THEN Marks by Student END) OVER ()
这样两列都会稳定显示对应月份的平均值,不受其他提示过滤的影响。
方案3:根据提示参数隐藏对应空列
如果你坚持要分两列展示,但不想看到空值列,可以在报表工具里设置列的显示条件:
- 当提示参数选择Nov时,隐藏第二列;
- 当提示参数选择Dec时,隐藏第一列。
这种方式不需要修改表达式,靠报表工具的显示规则来优化呈现效果。
内容的提问来源于stack exchange,提问作者geekycoder
相关产品推荐
相关产品推荐

