MDX - 过滤选定范围外的空白

MDX - filter empty outside of selected range

多维数据集填充了分为代表一个月的时间维度 ( period ) 的数据。

以下查询:
select non empty {[Measures].[a], [Measures].[b], [Measures].[c]} on columns, {[Period].[Period].ALLMEMEMBERS} on rows from MyCube

returns:
+--------+----+---+--------+ | Period | a | b | c | +--------+----+---+--------+ | 2 | 3 | 2 | (null) | | 3 | 5 | 3 | 1 | | 5 | 23 | 2 | 2 | +--------+----+---+--------+

正在删除非空
select {[Measures].[a], [Measures].[b], [Measures].[c]} on columns, {[Period].[Period].ALLMEMEMBERS} on rows from MyCube
渲染:
+--------+--------+--------+--------+ | Period | a | b | c | +--------+--------+--------+--------+ | 1 | (null) | (null) | (null) | | 2 | 3 | 2 | (null) | | 3 | 5 | 3 | 1 | | 4 | (null) | (null) | (null) | | 5 | 23 | 2 | 2 | | 6 | (null) | (null) | (null) | +--------+--------+--------+--------+

我想要得到的是从第 2 期到第 5 期的所有记录,度量 "a" 中值的第一次出现表示范围的开始,最后一次出现 - 范围的结束。

这有效 - 但我需要在运行时由 mdx 动态计算:
select non empty {[Measures].[a], [Measures].[b], [Measures].[c]} on columns, {[Period].[Period].&[2] :[Period].[Period].&[5]} on rows from MyCube

期望的输出: +--------+--------+--------+--------+ | Period | a | b | c | +--------+--------+--------+--------+ | 2 | 3 | 2 | (null) | | 3 | 5 | 3 | 1 | | 4 | (null) | (null) | (null) | | 5 | 23 | 2 | 2 | +--------+--------+--------+--------+

我尝试寻找 first/last 值,但无法将它们正确组合到查询中。以前有人遇到过这个问题吗?这应该很常见,因为我想获得一份连续的财务报告,而不会跳过没有任何事情发生的月份。谢谢。

也许尝试在 WITH 子句中使用 NonEmpty / Tail 函数:

WITH 
SET [First] AS
  {HEAD(NONEMPTY([Period].[Period].MEMBERS, [Measures].[a]))}
SET [Last] AS
  {TAIL(NONEMPTY([Period].[Period].MEMBERS, [Measures].[a]))}
SELECT
  {
   [Measures].[a]
 , [Measures].[b]
 , [Measures].[c]
  } on columns, 
   [First].ITEM(0).ITEM(0) 
  :[Last].ITEM(0).ITEM(0)  on rows 
FROM MyCube;

要调试自定义集,查看返回的成员,您可以这样做:

WITH 
SET [First] AS
  {HEAD(NONEMPTY([Period].[Period].MEMBERS, [Measures].[a]))}
SELECT
  {
   [Measures].[a]
 , [Measures].[b]
 , [Measures].[c]
  } on columns, 
   [First]  on rows 
FROM MyCube;

我认为阅读您关于儿童的评论意味着这也是一种替代方法 - 添加额外的 [Period]:

WITH 
SET [First] AS
  {HEAD(NONEMPTY([Period].[Period].[Period].MEMBERS
     , [Measures].[a]))}
SET [Last] AS
  {TAIL(NONEMPTY([Period].[Period].[Period].MEMBERS
     , [Measures].[a]))}
SELECT
  {
   [Measures].[a]
 , [Measures].[b]
 , [Measures].[c]
  } on columns, 
   [First].ITEM(0).ITEM(0) 
  :[Last].ITEM(0).ITEM(0)  on rows 
FROM MyCube;