创建设置以获取每年的上个月

时间:2015-07-24 19:34:48

标签: ssas mdx

我想创建一个返回每年最后一个日期的集合。例如,所有往年都将返回12月,但当前年份只会返回当月。

WITH 
  SET testset AS 
    NonEmpty
    (
      Generate
      (
        {
            OpeningPeriod([Date].[Calendar].[Month])
          : 
            ClosingPeriod([Date].[Calendar].Month)
        }
       ,{[Date].[calendar].CurrentMember}
      )
     ,[Measures].[Sale Amount]
    ) 
SELECT 
  NON EMPTY 
    (
      [Measures].[Sale Amount]
     ,[Date].[Year].[Year]
    ) ON 0
 ,NON EMPTY 
    [testset] ON 1
FROM [Cube]

以下是返回每个月值的脚本示例。我尝试过使用tail和lastchild,但这只会返回最新版本。我希望每年都能回来。

2 个答案:

答案 0 :(得分:3)

就上个月而言 - 忽略是否有数据:

WITH 
  SET [AllYears] AS 
    [Date].[Calendar].[Calendar Year].MEMBERS 
  SET [LastMths] AS 
    Generate
    (
      [AllYears] AS S
     ,Tail
      (
        Descendants
        (
          S.CurrentMember
         ,[Date].[Calendar].[Month]
        )
       ,1
      )
    ) 
SELECT 
  {} ON 0
 ,[LastMths] ON 1
FROM [Adventure Works];

返回:

enter image description here

如果我想调整上述内容,以便它是每年的最后一个月有特定指标的数据,那么将NonEmpty包裹在由Descendants创建的集合周围:

WITH 
  SET [AllYears] AS 
    [Date].[Calendar].[Calendar Year].MEMBERS 
  SET [LastMths] AS 
    Generate
    (
      [AllYears] AS S
     ,Tail
      (
        NonEmpty //<<new
        (
          Descendants
          (
            S.CurrentMember
           ,[Date].[Calendar].[Month]
          )
         ,[Measures].[Internet Sales Amount] //<<new
        )
       ,1
      )
    ) 
SELECT 
  {} ON 0
 ,[LastMths] ON 1
FROM [Adventure Works];

它现在给了我们这个:

enter image description here

然后我们可以添加你在行上的元组(由于[Date].[Calendar]已经在使用,我这次使用了属性层次结构多年了)

WITH 
  SET [AllYears] AS 
    [Date].[Calendar].[Calendar Year].MEMBERS 
  SET [LastMths] AS 
    Generate
    (
      [AllYears] AS S
     ,Tail
      (
        NonEmpty
        (
          Descendants
          (
            S.CurrentMember
           ,[Date].[Calendar].[Month]
          )
         ,[Measures].[Internet Sales Amount]
        )
       ,1
      )
    ) 
SELECT 
  NON EMPTY 
    (
      [Measures].[Internet Sales Amount]
     ,[Date].[Calendar Year].[Calendar Year]
    ) ON 0
 ,[LastMths] ON 1
FROM [Adventure Works];

现在我们明白了:

enter image description here

答案 1 :(得分:2)

@Whytheq已经给出了一个非常好的解决方案。将此作为替代方案。这可能会tad更快,因为它不使用GENERATE函数(不确定!)。

有一个计算/立方体度量,它基本上可以判断一个月是否是一年中的最后一个月。然后选择几个月内的那些月份。

with member measures.islastchild as
iif
    (
       [Date].[Calendar].currentmember is 
       [Date].[Calendar].currentmember.parent.parent.parent.lastchild.lastchild.lastchild,
       1,
       null
    )

如果月份是一年中的最后一个月,则成员measures.islastchild将返回1。否则它将返回null

set lastmonths as
filter(
        [Date].[Calendar].[Month].members, 
        measures.islastchild = 1
      )

集合lastmonths就是您需要的集合。

修改

为了进一步提高性能,您可以NonEmpty功能而不是迭代FILTER功能。

set lastmonths as
NonEmpty(
         [Date].[Calendar].[Month].members, 
         measures.islastchild
        )

select lastmonths on 1,
{} on 0
from [Adventure Works]

enter image description here

编辑2:获取销售额的最后一个月

with member measures.islastnonemptychild as
iif
    (
       [Date].[Calendar].currentmember is 
       TAIL(NonEmpty([Date].[Calendar].currentmember.parent.parent.parent.lastchild.lastchild.children, [Measures].[Sale Amount])).ITEM(0),
       1,
       null
    )

set nonemptylastmonths as
NonEmpty(
         [Date].[Calendar].[Month].members, 
         measures.islastnonemptychild 
        )