列出所有以前的年份并测量到今天,以便所有 12 个月的数据都可用于 year.Else 排除年份

List all previous Years and measure till today such that all 12 Month data is available for year.Else exclude the year

我们有一个典型的日期维度。

我正在努力写一个 MDX 来列出 Dim.Year 维度成员和度量严格包含所有月份的数据。(从 1 月到 12 月)否则不包括年份?。

这个:

SELECT 
  [Measures].[Internet Sales Amount] ON 0
 ,[Date].[Calendar].[Calendar Year].MEMBERS ON 1
FROM [Adventure Works];

Returns这个:

如果我现在添加 NON EMPTY 我应该去掉 2009 和 2010:

SELECT 
  [Measures].[Internet Sales Amount] ON 0
 ,NON EMPTY 
    [Date].[Calendar].[Calendar Year].MEMBERS ON 1
FROM [Adventure Works];

现在returns:

上面是一个很简单的例子
其他情况可能需要我们使用其他函数摆脱 nulls,例如 FILTER / NonEmpty / HAVING / IIF.


编辑

对于有 12 个月数据的 return 年,我编写了以下内容(比上面的要复杂一点!)。稍后我会尝试简化,尽管您肯定需要额外的措施来实现您的目标,

WITH 
  MEMBER [Measures].[cntMths] AS 
    Count
    (
      NonEmpty
      (
        Descendants
        (
          [Date].[Calendar].CurrentMember
         ,[Date].[Calendar].[Month]
         ,SELF
        )
       ,[Measures].[Internet Sales Amount]
      )
    ) 
SELECT 
  {
    [Measures].[Internet Sales Amount]
  } ON 0
 ,NON EMPTY 
    [Date].[Calendar].[Calendar Year].MEMBERS HAVING 
  [Measures].[cntMths] = 12 ON 1
FROM [Adventure Works];

编辑(@sourav_agasti)

这是针对 Adventure Works 的解决方案,它仅使用属性层次结构,即对于没有格式良好的日期维度的多维数据集:

WITH 
  MEMBER [Measures].[cntMths] AS 
    Count
    (
      NonEmpty
      (
          [Date].[Calendar Year].CurrentMember
        * 
          [Date].[Month of Year].[Month of Year].MEMBERS
       ,[Measures].[Internet Sales Amount]
      )
    ) 
SELECT 
  {} ON 0
 ,[Date].[Calendar Year].[Calendar Year].MEMBERS HAVING 
  [Measures].[cntMths] = 12 ON 1
FROM [Adventure Works];

这相当于使用上述方法的 Sourav 脚本:

WITH 
  MEMBER [Measures].[cntMths] AS 
    Count
    (
      NonEmpty
      (
          [Dim Year].[Year].CurrentMember
        * 
          [Dim Month].[Month].MEMBERS
       ,[Measures].[Foo]
      )
    ) 
SELECT 
  {} ON 0
 ,[Dim Year].[Year].[Year].MEMBERS HAVING 
  [Measures].[cntMths] = 12 ON 1
FROM [Your Cube];

进一步编辑

昨晚偶然看到一篇文章,里面给出了一个更有效的方法。显然,我在上面所做的 Count - NonEmpty 没有调整为在块计算模式下工作,而 Sum -IIF 是。所以这里有一个使用后一种方法的更快的替代方法:

WITH 
  MEMBER [Measures].[cntMths - S] AS 
    Sum
    (
      [Date].[Month of Year].[Month of Year].MEMBERS
     ,IIF
      (
        IsEmpty([Measures].[Internet Sales Amount])
       ,null
       ,1
      )
    ) 
SELECT 
  {[Measures].[cntMths - S]} ON 0
 ,[Date].[Calendar Year].[Calendar Year].MEMBERS HAVING 
  [Measures].[cntMths - S] = 12 ON 1
FROM [Adventure Works];

我将编写代码来获取结果而没有任何层次结构作为挑战。所以这是我的尝试(经过几个小时的疯狂!)。

你一定也有一个 [Dim Month] 维度。我假设那里的数据存储为 Dec-2014Dec 2014。基本上假设最后 4 位数字给出年份。 现在,计算有数据年份的一种方法是首先列出所有 没有 数据的月份,然后计算这些月份的年份,然后 [=23] =]NOT 在最终输出中显示这些年份。

下面的代码可以为您完成:

WITH SET MonthsWithNoData AS
FILTER([Dim Month].[Month].CHILDREN, [Measures].[foo] = 0)

MEMBER [Measures].Year as
RIGHT([Dim Month].[Month].CURRENTMEMBER.member_value, 4)

SET SetOfYearsWithNoData AS
GENERATE(MonthsWithNoData, STRTOSET("[Dim Year].[Year].&[" + RIGHT(MonthsWithNoData.currentmember.member_value, 4) + "]"))

SET SetOfYearsWithData AS
([Dim Year].[Year].MEMBERS - SetOfYearsWithNoData)

member yearValues as
[Dim Year].[Year].currentmember.member_value

member wellFormedyearValues as
[Dim Year].[Year].currentmember.member_unique_name

SELECT {yearvalues, wellFormedyearValues} on 0, 
SetOfYearsWithData on 1
from [Your cube]

我同意最终输出看起来不太漂亮。话虽如此,层次结构会使代码不那么复杂,MDX 也会简单得多。具有必要层次结构的 [Calender] 维度(正如@whytheq 的回答中所假设的那样)在优雅和性能方面将是更好的方法。