OBIEE 11.1.1.9.0同一列用多数据库函数加聚合函数报错求助
从你给出的错误栈来看,核心问题是ORA-00979: not a GROUP BY expression——这是Oracle数据库的经典错误,意思是当SELECT语句中包含聚合函数(比如你用的COUNT(DISTINCT...))时,所有非聚合的列必须出现在GROUP BY子句里。而OBIEE自动生成的SQL里没有包含这些非聚合列,导致数据库报错。
结合你用EVALUATE('DB_function1(DB_function2(%1))' AS VARCHAR(100), "MY_COLUMN")的场景,问题出在OBIEE的逻辑引擎没有正确识别到:你用EVALUATE生成的列(或者分析中的其他非聚合列)需要被加入GROUP BY,尤其是当聚合函数和自定义EVALUATE表达式混合使用时,OBIEE的自动分组逻辑容易出问题。
具体解决方案:
1. 强制设置分析中所有非聚合列为「分组依据」
打开你的OBIEE分析,进入标准标签页:
- 找到你添加的
MY_COLUMN_TEXT列(也就是生成SQL里的s_1),点击列右侧的「编辑」图标 - 在弹出的列编辑窗口中,切换到聚合选项卡
- 将聚合方法从「默认」改为分组依据
- 如果你用EVALUATE生成的列也是作为非聚合列展示的,同样把它的聚合方法设为「分组依据」
这样OBIEE在生成SQL时,会自动把这些列加入GROUP BY子句,符合Oracle的语法要求。
2. 调整COUNT与EVALUATE的嵌套方式
如果你的需求是对EVALUATE处理后的结果做COUNT聚合,直接把EVALUATE放到COUNT内部,而不是分开成两个列:
COUNT(DISTINCT EVALUATE('DB_function1(DB_function2(%1))' AS VARCHAR(100), "SUBJECT_AREA"."SCHEMA_NAME"."TABLE_NAME"."MY_COLUMN"))
这种写法下,OBIEE会识别整个表达式是聚合函数的一部分,不会把它当成独立的非聚合列要求GROUP BY,从根源避免错误。
3. 检查逻辑层列的聚合配置(如果EVALUATE是在逻辑层定义的)
如果你是在OBIEE的逻辑层(业务模型与映射)中定义的EVALUATE列:
- 打开业务模型,找到该逻辑列
- 在列的属性中,切换到聚合选项卡
- 确保聚合规则设置正确:如果这个列不需要聚合,选择「基于源的聚合」或者「分组依据」;如果需要和其他聚合函数配合,调整对应的规则。
验证方法
修改设置后,重新运行分析,查看OBIEE生成的SQL是否包含了正确的GROUP BY子句——比如应该类似:
SELECT 0 s_0, "SUBJECT_AREA"."TABLE_NAME"."MY_COLUMN_TEXT" s_1, COUNT(DISTINCT "SUBJECT_AREA"."TABLE_NAME"."MY_COLUMN_XY") s_2 FROM "SUBJECT_AREA" GROUP BY 0, "SUBJECT_AREA"."TABLE_NAME"."MY_COLUMN_TEXT" FETCH FIRST 100000001 ROWS ONLY
这样就符合Oracle的GROUP BY要求了,错误会消失。
内容的提问来源于stack exchange,提问作者yagmurdursun

