OBIEE使用相同的文件夹/事实两次聚合

时间:2013-05-20 14:32:54

标签: oracle business-intelligence obiee

我知道我需要编写的确切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中使用?如果是,我该如何实现?

1 个答案:

答案 0 :(得分:3)

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

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

Edit column formula

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

enter image description here

在下面的对话框中双击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中过滤列值的过程。