如何确定用户正在钻取的日期层次结构

时间:2014-11-19 00:50:43

标签: ssas mdx

我正在尝试沿着DateTool机制的方式实现计算维度,如Chris Webb等人在Expert Cube Development一书中所述。

问题在于,与大多数组织一样,我们需要按财务和日历层次结构进行报告,并基于事务表中的多个日期进行报告。

我非常希望能够定义一个计算维度,根据用户选择的时间维度和层次结构重新定义哪个时间维度和使用的日历。

以下是代码示例:

     (     [Time Calculations].[Calculation].[Year to Date] )
      = 
            Sum(PeriodsToDate([Time Order Date].[Fiscal Date].[Fiscal Year Name],
                              [Time Order Date].[Fiscal Date].CurrentMember

                             ),
                [Time Calculations].DefaultMember
               )

我非常想把它重写为:

     (     [Time Calculations].[Calculation].[Year to Date] )
      = 

      case 
      when user is viewing using the Order Date, Fiscal Calendar then
           Sum(PeriodsToDate([Time Order Date].[Fiscal Date].[Fiscal Year Name],
                              [Time Order Date].[Fiscal Date].CurrentMember

                             ),
                [Time Calculations].DefaultMember
               )

      when user is viewing using the Ship Date, Fiscal Calendar then
           Sum(PeriodsToDate([Time Ship Date].[Fiscal Date].[Fiscal Year Name],
                              [Time Ship Date].[Fiscal Date].CurrentMember

                             ),
                [Time Calculations].DefaultMember
               )

      when user is viewing using the Order Date, Calendar hierarchy then
           Sum(PeriodsToDate([Time Order Date].[Calendar].[Year Name],
                              [Time Order Date].[Date].CurrentMember

                             ),
                [Time Calculations].DefaultMember
               )

      when user is viewing using the Ship Date, Calendar hierarchy then
           Sum(PeriodsToDate([Time Ship Date].[Date].[Year Name],
                              [Time Ship Date].[Date].CurrentMember

                             ),
                [Time Calculations].DefaultMember
               )

      else null end

这可能吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试将以下内容插入到多维数据集脚本中。这应该知道任何Year级别,无论它们是在轴上还是在子选择中使用。

此代码使用动态集知道subselects的事实。除此之外,Existing中使用了关键字IIF,以便计算也了解WHERE子句或Axis中使用的层次结构。

Head功能是出于性能原因。您只需要知道是否选择了至少1 member个维度。没有必要统计所有这些。

当未选择任何所需的层次结构时,脚本将返回NULL

CREATE HIDDEN DYNAMIC SET CURRENTCUBE.[OrderDateFiscalYearAll]
 AS [Time Order Date].[Fiscal Date].[Fiscal Year Name].MEMBERS;

CREATE HIDDEN DYNAMIC SET CURRENTCUBE.[OrderDateCalendarYearAll]
 AS [Time Order Date].[Calendar].[Year Name].MEMBERS;

CREATE HIDDEN DYNAMIC SET CURRENTCUBE.[ShipDateFiscalYearAll]
 AS [Time Ship Date].[Fiscal Date].[Fiscal Year Name].MEMBERS;

CREATE HIDDEN DYNAMIC SET CURRENTCUBE.[ShipDateCalendarYearAll]
 AS [Time Ship Date].[Calendar].[Year Name].MEMBERS;

Scope([Time Calculations].[Calculation].[Year to Date]);
    This = IIF(Count(Head(Existing [OrderDateFiscalYearAll], 1)) > 0
        ,/* Insert OrderDateFiscalYear calculation here */
        ,IIF(Count(Head(Existing [OrderDateCalendarYearAll], 1)) > 0
            ,/* Insert OrderDateCalendarYear calculation here */
            ,IIF(Count(Head(Existing [ShipDateFiscalYearAll], 1)) > 0
                ,/* Insert ShipDateFiscalYear calculation here */
                ,IIF(Count(Head(Existing [ShipDateCalendarYearAll], 1)) > 0
                    ,/* Insert ShipDateCalendarYear calculation here */
                    ,NULL))))
End Scope;