mdx 中的最后一个非空值,用于在两个日期和状态之间过滤事件

Last non empty value in mdx for events filtering between two dates and status

我有正在进行的活动。每个事件都有日期、金额和状态。我需要一个计算成员,其中 return 按事件、州和从 1 月的第一天到同年选定日期的最后金额

我尝试了半加法 LastChildNonEmpty,但 return 对于具有最后日期的事件只有一行

根据这些数据,我预计:


|活动 |日期 |金额 |状态 |

|事件1 | 20180301 | 05 |打开 |

|事件1 | 20180311 | 12 |打开 |

|活动2 | 20180406 | 02 |打开 |

|事件1 | 20180523 | 60 |关闭 |

|活动2 | 20180809 | 07 |关闭 |

|事件1 | 20190104 | 27 |打开 |

问题和结果

- 20180101 到 20180331 状态打开的事件:
EVENT1 20180311 12开

- 20180101 和 20180430 状态之间的事件打开
EVENT1 20180311 12开

EVENT2 20180406 2 开启

- 20180101 和 20180531 状态之间的事件打开
EVENT2 20180406 2 开放

- 20180101 和 20180531 状态之间的事件关闭
EVENT1 20180523 60 关闭

如果格式不好,我很抱歉,但我正在阅读,但我不知道如何使用数据

创建table

谢谢

您可以通过计算的措施解决上述问题。 mdx 函数 BottomCount 将解决您的问题。下面是一个基于 AdventureWorks 的示例。下面的查询列出了日期、销售原因和客户数量。

select [Measures].[Customer Count] on columns,
nonempty(
{(
{[Date].[Date].&[20130101]:[Date].[Date].&[20130713]},
[Sales Reason].[Sales Reason].[Sales Reason])}
,[Measures].[Customer Count]
)
on rows
from [Adventure Works]
where 
([Date].[Calendar Year].&[2013])

结果

现在让我们针对示例案例进行计算测量和测试。

with member measures.t 
as 
(bottomcount(
nonempty(
existing
{([Date].[Date].[Date].members,[Sales Reason].[Sales Reason].currentmember)}
,[Measures].[Customer Count]),
1
).item(0)
,[Measures].[Customer Count])

select measures.t on columns 
from [Adventure Works]
where 
([Date].[Date].&[20130101]:[Date].[Date].&[20130111],
[Sales Reason].[Sales Reason].[Other])

我们的想法是,您可以传递日期范围和销售原因,度量将列出最后一个值。

编辑:以下查询将处理用户传递一个日期并传递属性层次结构的情况。如果通过了用户层次结构,则可以防止年份开始的硬编码

with member measures.t 
as 
(bottomcount(
nonempty(
{({[Date].[Date].&[20130101]:[Date].[Date].currentmember},[Sales Reason].[Sales Reason].currentmember)}
,[Measures].[Customer Count]),
1
).item(0)
,[Measures].[Customer Count])
select measures.t on columns 
from [Adventure Works]
where 
([Date].[Date].&[20130111],
[Sales Reason].[Sales Reason].[Other])