OAS中跨层级聚合不同父级节点值的技术问询
问题描述
层级结构
- A1 - A11 - A111 - A1111
- A1 - A12 - A121 - A1211
- B1 - B11 - B111 - B1111
事实表结构及数据
| Id | Class | Amt |
|---|---|---|
| 1 | A1211 | 10 |
| 1 | A1111 | 20 |
| 1 | B1111 | 40 |
需求
聚合层级1的B1与层级2的A12对应的Amt总和,预期结果:Id=1时sumAmt=50。
当前困境
在Oracle Analytics Server(OAS)及RPD中使用常规同层级聚合方法无法得到预期结果,需可行解决方案。
解决方案
针对跨层级聚合需求,可通过以下两种方式在OAS/RPD中实现:
方法1:RPD中构建层级映射+自定义聚合规则
- 在RPD维度模型中,为Class字段添加全层级属性(如
Level1、Level2、Level3、Level4),将每个Class值映射到对应层级节点:- A1211 → Level1=A1, Level2=A12, Level3=A121, Level4=A1211
- A1111 → Level1=A1, Level2=A11, Level3=A111, Level4=A1111
- B1111 → Level1=B1, Level2=B11, Level3=B111, Level4=B1111
- 在事实表中创建计算列,标记符合聚合条件的记录:
CASE WHEN "Level1" = 'B1' THEN "Amt" WHEN "Level2" = 'A12' THEN "Amt" ELSE 0 END AS Qualified_Amt - 将该计算列的聚合规则设为
SUM,分析中按Id聚合Qualified_Amt即可得到预期结果。
方法2:OAS分析中使用自定义逻辑SQL
在OAS分析编辑界面,编写逻辑SQL直接实现跨层级筛选求和:
SELECT "Id", SUM( CASE WHEN "Class" LIKE 'A12%' THEN "Amt" -- 匹配A12层级下所有子节点 WHEN "Class" LIKE 'B1%' THEN "Amt" -- 匹配B1层级下所有子节点 ELSE 0 END ) AS sumAmt FROM 你的事实表名称 GROUP BY "Id"
注:若Class层级编码为固定长度格式,可改用
SUBSTR精准匹配,例如SUBSTR("Class",1,4)='A12'对应A12层级,SUBSTR("Class",1,2)='B1'对应B1层级。
内容的提问来源于stack exchange,提问作者Moha Arfaoui
相关产品推荐
相关产品推荐

