使用计算成员传递参数 - MDX

Posted

技术标签:

【中文标题】使用计算成员传递参数 - MDX【英文标题】:Passing Parameters using a Calculated member - MDX 【发布时间】:2012-05-24 18:13:27 【问题描述】:

我正在尝试使用计算成员构建带有参数的查询。

我已经为“硬编码”的司法计数创建了计算成员,并且我创建的参数不会影响每个组的总数。

但是,我需要将每个总计数与工作参数一起列出。如果所选司法类型没有值,则应显示零计数。

我确信有一个简单的方法,但我对 MDX/s-s-rS 相当陌生。非常感谢任何帮助!

这里是查询:

WITH 

Member  [Measures].[Jud] as
        (
        [Dim Foreclosure Loan].[Judicial Flag].[1],
        [Dim Foreclosure Loan].[FCL Stage].&[Sale Held],
        [Measures].[Loan Count]
        )
Member  [Measures].[Non-Jud] as
        (
        [Dim Foreclosure Loan].[Judicial Flag].[0],
        [Dim Foreclosure Loan].[FCL Stage].&[Sale Held],
        [Measures].[Loan Count]
        )
Member  [Measures].[Total] as
        (
        [Dim Foreclosure Loan].[Judicial Flag],
        [Dim Foreclosure Loan].[FCL Stage].&[Sale Held],
        [Measures].[Loan Count]
        )
--------------------------------    Query Begins    --------------------------------
SELECT NON EMPTY
        
        ([Dim Date].[Calendar].[Day].Members)
         ON ROWS,
        NON EMPTY 
        (
        ([Measures].[Jud]),
        ([Measures].[Non-Jud]),
        ([Measures].[Total])
        ) ON COLUMNS
        FROM ( SELECT ( STRTOSET(@DimForeclosureLoanJudicialFlag, CONSTRAINED) ) ON COLUMNS
        FROM [Foreclosure])
        WHERE 
        (IIF( STRTOSET(@DimForeclosureLoanJudicialFlag, CONSTRAINED).Count = 1,
        STRTOSET(@DimForeclosureLoanJudicialFlag, CONSTRAINED),
        [Dim Foreclosure Loan].[Judicial Flag].currentmember)
        )CELL PROPERTIES VALUE

更新:需要有关提供的 iif 语句的帮助;请参阅下面的 cmets。

【问题讨论】:

【参考方案1】:

我不是 100% 清楚你在问什么,但如果我要重申它,我认为这就是你想要做的。我想你想在列上看到 Jud、Non-Jud 和 Total。我认为您正在尝试使用该参数来选择特定的司法标志。不清楚的是参数值是否限制为 1 和 2,如您为度量显示的那样,或者是否存在一个层次结构,其中 1 和 2 有子级。我将假设第一个,因为它最简单解释一下,我们可以从那里开始。

您需要为司法标志 1 和 2 设置措施,以考虑 WHERE 子句中的内容。现在它们是硬编码的,这告诉 SSAS 忽略 WHERE 子句中的任何内容。您需要通过在 Measure 定义中包含 IIF 语句来有条件地使用它。您应该返回一个 NULL 值作为 False 条件,以便 SSAS 可以最佳地执行查询,然后使用 format_string 属性填充零来代替 NULL(这比在 False 条件中使用 0 更好性能)。但是,列上的NON EMPTY 关键字将消除WHERE 子句中未包含的司法标志,因此您需要将其删除。将其保留在行上,以便仅显示具有 Jud 或 Non-Jud 值的日期。

根据我对您正在尝试做的事情的猜测,这是对您的查询的尝试:

WITH 
  MEMBER [Measures].[Jud] AS 
  iif(
        [Dim Foreclosure Loan].[Judicial Flag].CurrentMember is 
            [Dim Foreclosure Loan].[Judicial Flag].[1], 
            (
              [Dim Foreclosure Loan].[Judicial Flag].[1]
             ,[Dim Foreclosure Loan].[FCL Stage].&[Sale Held]
             ,[Measures].[Loan Count]
            ),
            NULL), format_string="#;#;0;0"
  MEMBER [Measures].[Non-Jud] AS 
  iif(
        [Dim Foreclosure Loan].[Judicial Flag].CurrentMember is 
            [Dim Foreclosure Loan].[Judicial Flag].[0], 
            (
              [Dim Foreclosure Loan].[Judicial Flag].[0]
             ,[Dim Foreclosure Loan].[FCL Stage].&[Sale Held]
             ,[Measures].[Loan Count]
            ),
            NULL), format_string="#;#;0;0" 
  MEMBER [Measures].[Total] AS 
    (
      [Dim Foreclosure Loan].[Judicial Flag]
     ,[Dim Foreclosure Loan].[FCL Stage].&[Sale Held]
     ,[Measures].[Loan Count]
    ) 
SELECT 
  NON EMPTY 
    
      [Dim Date].[Calendar].[Day].MEMBERS
     ON ROWS
 , 
    
      [Measures].[Jud]
     ,[Measures].[Non-Jud]
     ,[Measures].[Total]
     ON COLUMNS
FROM 
(
  SELECT 
    StrToSet
    (@DimForeclosureLoanJudicialFlag
     ,CONSTRAINED
    ) ON COLUMNS
  FROM [Foreclosure]
)
WHERE 
  IIF
  (
      StrToSet
      (@DimForeclosureLoanJudicialFlag
       ,CONSTRAINED
      ).Count
    = 1
   ,StrToSet
    (@DimForeclosureLoanJudicialFlag
     ,CONSTRAINED
    )
   ,[Dim Foreclosure Loan].[Judicial Flag].CurrentMember
  )
CELL PROPERTIES VALUE, FORMATTED_VALUE;

【讨论】:

感谢斯塔西亚的帮助!很好地猜测你认为我需要什么。该解决方案非常适合我的需求。我非常感谢您花时间提供如此详细的答案和解释。万事如意! 您好! @Stacia 提供的 iif 语句部分满足我的需要。我注意到在选择参数之前,计数不会出现在 s-s-rS 中。如果 iif 语句的顺序颠倒,则计数最初出现,但在选择参数时消失。我希望计数最初出现并仅在所选参数不匹配时才消失。任何帮助表示赞赏! 您的参数的默认值是多少?如果对您的环境没有更全面的了解,就很难提出解决方案。

以上是关于使用计算成员传递参数 - MDX的主要内容,如果未能解决你的问题,请参考以下文章

SpagoBI OLAP 报告传递可选参数

如何将实例成员的默认参数值传递给方法?

如何将实例成员的默认参数值传递给方法?

MDX StrToMember 日期范围问题

GroovyGroovy 方法调用 ( Groovy 构造函数中为成员赋值 | Groovy 函数的参数传递与键值对参数 | 完整代码示例 )

如何将成员函数作为参数传递?