列出所有以前的年份,并测量到今天所有12个月的数据可用于年份。除去年份

时间:2015-02-10 07:23:28

标签: sql mdx analysis

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

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

2 个答案:

答案 0 :(得分:0)

此:

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

返回:

enter image description here

如果我现在加入NON EMPTY我应该摆脱2009年和2010年:

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

现在返回:

enter image description here

以上是一个非常简单的例子 其他情况可能要求我们使用null / FILTER / NonEmpty / HAVING等其他功能摆脱IIF


修改

为了回到有12个月数据的年份,我写了以下内容(比上面的内容更复杂!)。我稍后会尝试简化,但你肯定需要一个额外的措施来实现你的目标,

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]; 。所以这是使用后一种方法的更快的替代方法:

{{1}}

答案 1 :(得分:0)

我把它作为一个挑战来编写一个代码,它可以在没有任何层次结构的情况下获得结果。所以这是我的尝试(经过几个小时的疯狂!)。

您也必须拥有[Dim Month]尺寸。我假设存储的数据类似于Dec-2014Dec 2014。基本上假设最后4位给出年份。 现在,您可以找出数据年份的一种方法是首先列出拥有数据的所有月份,然后计算出这几个月的年份然后 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&#39答案中假设)将是优雅和性能方面的更好方法。