0

我知道从 Oracle BI 工具中检索我正在寻找的结果需要编写的确切 SQL,但是,由于我是 Oracle BI 的新手,我正在努力寻找一种方法来重现相同的结果。我意识到最终的答案在很大程度上取决于 BI 数据模型,这需要比 Stack Overflow 上的问题更多的沟通,所以我正在寻找更通用的操作方法答案,而不是针对我的场景的特定明确答案。

也许 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 中是否可行,如果可以,我该如何实现?

4

1 回答 1

3

我假设您已将 Measurement (M) 和 DwellTimeMeasurement (DTM) 表导入 RPD 的物理层,在 DTM.MeasurementBase_id = M.Id 上指定连接,然后将它们都带到表示层。

如果是这样,那么您可以通过从 DTM 中拖入 M.EndDateTime 和任何 OBIEE 度量列(例如 DTM.Amount),开始在标准选项卡上的 Answers 中构建此查询。编辑 DTM.Amount 列的公式:

编辑列公式

通过单击下面以蓝色显示的过滤器按钮来过滤列。

在此处输入图像描述

在以下对话框中双击 M.MeasValue,然后选择“小于或等于”并在“值”文本框中键入 300。单击确定两次,您的列公式现在应该如下所示:

FILTER(DTM.Amount USING (M.MeasValue <= 300))

现在用 COUNT() 包装它:

COUNT(FILTER(DTM.Amount USING (M.MeasValue <= 300)))

这将给出 M.MeasValue <= 300 的记录数。您可以将此列重命名为“LessThan5Mins”。单击确定以保存新公式。现在再次拖入 DTM.Amount 列,但这次只执行 COUNT():

COUNT(DTM.Amount)

这将为您提供所有停留时间记录的计数。您可以将其重命名为“全部”。最后最后一次拖入 DTM.Amount 列并再次编辑它的公式。在这里,您将使用类似于以下的公式计算百分比:

COUNT(FILTER(DTM.Amount USING (M.MeasValue <= 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 中过滤列值的过程。

于 2013-05-21T14:39:06.620 回答