我知道我需要编写的确切SQL来检索我正在寻找的Oracle BI工具的结果,但是,由于我是Oracle BI的新手,我很难找到重现相同结果的方法。我意识到最终的答案在很大程度上取决于BI数据模型,并且需要比Stack Overflow上的问题更多的通信,所以我正在寻找比我的场景的特定确定答案更通用的how-to答案。
也许SQL会对初学者有所帮助:
select "All"."DT", ("LessThan5Mins"."Count" / "All"."Count") * 100
from
(
select to_char(m."EndDateTime", 'YYYY-MM') "DT", count(*) "Count"
from "Measurement" m,
"DwellTimeMeasurement" dtm
where dtm."MeasurementBase_id" = m."Id"
group by to_char(m."EndDateTime", 'YYYY-MM')
) "All",
(
select to_char(m."EndDateTime", 'YYYY-MM') "DT", count(*) "Count"
from "Measurement" m,
"DwellTimeMeasurement" dtm
where dtm."MeasurementBase_id" = m."Id"
and m."MeasValue" <= 300
group by to_char(m."EndDateTime", 'YYYY-MM')
) "LessThan5Mins"
where "All"."DT" = "LessThan5Mins"."DT";
这样做的目的是返回小于或等于5分钟(300秒)的停留时间记录的百分比。
我有一个事实代表上述查询中的“MeasValue”字段。
我在BI中重现上述查询的双重结果集性质所做的所有尝试都失败了。
以上是否可以在OBIEE中使用?如果是,我该如何实现?
答案 0 :(得分:3)
我假设您已将Measurement(M)和DwellTimeMeasurement(DTM)表导入RPD的物理层,在DTM.MeasurementBase_id = M.Id上指定了连接,然后将它们都通过到表示层。
如果是这样,那么您可以通过在DTE中拖动M.EndDateTime和任何OBIEE度量列(例如DTM.Amount),在条件选项卡上的Answers中开始构建此查询。编辑DTM.Amount列的公式:
通过单击下面蓝色显示的过滤器按钮来过滤列。
在下面的对话框中双击M.MeasValue,然后选择&#34;小于或等于&#34;并在“值”文本框中键入300。单击“确定”两次,您的列公式现在应如下所示:
FILTER(DTM.Amount USING (M.MeasValue <= 300))
现在用COUNT()包装它:
COUNT(FILTER(DTM.Amount USING (M.MeasValue <= 300)))
这将给出M.MeasValue&lt; = 300的记录计数。您可以将此列重命名为&#34; LessThan5Mins&#34;。单击“确定”以保存新公式。现在再次拖动DTM.Amount列,但这次只执行COUNT():
COUNT(DTM.Amount)
这将为您提供所有停留时间记录的计数。您可以将其重命名为&#34; All&#34;。最后最后一次拖动DTM.Amount列并再次编辑它的公式。您可以在此处使用与以下内容类似的公式计算百分比:
COUNT(过滤器(DTM.Amount USING(M.MeasValue&lt; = 300)))/ COUNT(DTM.Amount)* 100
因此,最终您将拥有包含以下标题和公式的四列:
TITLE FORMULA
----- --------
EndDateTime M.EndDateTime
LessThan5Mins COUNT(FILTER(DTM.Amount USING (M.MeasValue <= 300)))
All COUNT(DTM.Amount)
% LessThan5Mins COUNT(FILTER(DTM.Amount USING (M.MeasValue <= 300))) / COUNT(DTM.Amount) * 100
请注意,包括EndDateTime列负责对记录进行分组。另外,要匹配原始查询,您只需要EndDateTime和%LessThan5Mins列(您可以隐藏或排除其他列),但我想向您演示在OBIEE中过滤列值的过程。