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

时间:2019-02-11 16:50:19

标签: mdx

我正在进行一些活动。每个事件都有日期,金额和状态。我需要一个计算成员,该成员可以按事件,州和从一月的第一天到同一年的选定日期之间返回最后的金额

我尝试了半加法LastChildNonEmpty,但对于最后一次发生事件的事件仅返回一行

使用这些数据,我期望:


|大事记日期|金额|状态|

|活动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关闭

很抱歉,如果格式不正确,但我已阅读并且不知道如何用数据创建表

谢谢

1 个答案:

答案 0 :(得分:0)

您可以通过计算出的度量值解决上述问题。 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])

结果 enter image description here

现在让我们进行计算得出的量度并测试是否适用于示例案例。

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])

enter image description here

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

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

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])