假设我在多维数据集中有一个度量foo
,并且我有一个报告要求,用户希望在报告中看到以下度量:
total foo
total foo excluding instances where foo > 10
total foo excluding instances where foo > 30
处理此问题的最佳方法是什么?
在过去,我添加了命名计算,如果NULL
则返回foo > 10
,否则返回foo
。
我觉得必须有一种方法可以在MDX中实现这一点(类似于Filter([Measures].[foo], [Measures].[foo] > 10))
,但我不能为我的生活做出任何贡献。
有什么想法吗?
答案 0 :(得分:3)
诀窍是你需要在你的套装上应用滤镜,而不是你的尺度。
例如,使用通常的Microsoft“仓库和销售”演示多维数据集,以下MDX将显示销售额超过2000美元的所有商店的销售额。
SELECT Filter([Store].[Stores].[Store].members, [Unit Sales] > 2000) ON COLUMNS, [Unit Sales] ON ROWS FROM [Warehouse and Sales]
答案 1 :(得分:0)
我认为你有两个选择:
1-在您的事实中添加列(或在基于事实表的数据源视图上查看),如:
case when unit_Price>2000 then 1
else 0
end as Unit_Price_Uper_Or_Under_10
并根据此列值添加虚构的Dimension。 并为New Dimension添加命名查询(比如datasourceview中的Range_Dimension: 选择1作为范围 联合所有 选择0作为范围
之后你不能像其他维度和属性一样使用这个过滤器。
SELECT [Store].[Stores].[Store].members ON COLUMNS,
[Unit Sales] ON ROWS
FROM [Warehouse and Sales]
WHERE [Test_Dimension].[Range].&[1]
问题在于您必须添加When
条件的每个范围,并且只有当范围是静态时,此解决方案才是一个很好的解决方案。
对于动态范围,最好配制范围(基于消除方法)
2-基于事实表在事实表附近添加粒度尺寸
例如,如果我们有主键Sale_id
的事实表。我们可以添加
基于事实表的维度,只有一列sale_Id
和dimension Usage tab
我们可以将此new dimension
和measure group
与关系类型Fact
相关联
之后在mdx中我们可以使用类似的东西:
filter([dim Sale].[Sale Id].[Sale Id].members,[Measures].[Unit Price]>2000)
答案 2 :(得分:0)
我在使用saiku(后端与Mondrain)时遇到了类似的问题,因为我没有找到任何明确的“添加过滤器测量”的解决方案,我在这里添加了它,这可能对其他人有用。
在Saiku3.8中,您可以在UI上添加过滤器:“column” - >“filter” - >“custom”,然后您可能会看到Filter MDX Expression。
我们假设我们希望Ad中的点击次数大于1000,然后在那里添加以下行:
[Measures].[clicks] > 1000
保存并关闭,然后该过滤器对于点击次数大于1000的查找元素有效。
MDX喜欢以下(假设dt为尺寸和点击次数,我们希望找到点击次数超过1000的dt)
WITH
SET [~ROWS] AS
Filter({[Dt].[dt].[dt].Members}, ([Measures].[clicks] > 1000))
SELECT
NON EMPTY {[Measures].[clicks]} ON COLUMNS,
NON EMPTY [~ROWS] ON ROWS
FROM [OfflineData]