MDX - 在所选范围之外过滤空

时间:2017-12-29 17:52:09

标签: filter ssas mdx date-range

多维数据集填充的数据分为时间维度(句点),表示一个月。

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

回报:
+--------+----+---+--------+ | 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 | +--------+--------+--------+--------+

我尝试查找第一个/最后一个值但是无法正确地将它们组合到查询中。以前有人有这个问题吗?这应该是非常普遍的,因为我希望获得连续的财务报告而不会跳过没有任何进展的月份。谢谢。

1 个答案:

答案 0 :(得分:0)

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

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;