0

我有以下问题。如果我使用作为函数的关键图查询值,我无法指定相同维度限制的多个值,但如果它不是函数,则它可以工作。

所以这有效:

SELECT {[Measures].[Netto]} on columns FROM TDC where
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00]), 
  NonEmpty([Time].[Month].[Month].&[2008-04-01T00:00:00])})

但这不会:

SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00]), 
 NonEmpty([Time].[Month].[Month].&[2008-04-01T00:00:00])})

这也有效:

SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where 
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00])})

我想解决方案类似于将 where 子句添加到标题中,但我真的很喜欢这个解决方案,因为它非常简单。

计算函数为:

CREATE MEMBER CURRENTCUBE.[MEASURES].Ultimo
AS (iif ((not [Time].[Year - Month - Date].currentmember is [Time].[Year - Month - Date].defaultmember),
IIF(NOT ([Measures].[LagerStk] = 0),
Sum([Time].[Year - Month - Date].[Date].members(0):
ClosingPeriod([Time].[Year - Month - Date].[Date]),
[Measures].[LagerStk]), NULL)
, 
IIF(NOT ([Measures].[LagerStk] = 0),
Sum([Time].[Year - Week - Date].[Date].members(0):
ClosingPeriod([Time].[Year - Week - Date].[Date]),
[Measures].[LagerStk]), NULL))), 
VISIBLE = 1;

该代码受此启发,并针对时间维度中的两个层次结构进行了修改:http ://www.sqlserveranalysisservices.com/OLAPPapers/InventoryManagement%20in%20AS2005v2.htm

这是在 SQL Server 2005 企业版上。

4

2 回答 2

1

好的,这有效:

WITH MEMBER [Time].[Month].a AGGREGATE 
({[Time].[Month].[Month].&[2008-03-01T00:00:00], 
  [Time].[Month].[Month].&[2008-04-01T00:00:00]})
SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where a
于 2008-12-16T16:41:03.833 回答
0

问题在于您的计算量度。您正在使用 .CurrentMember 和 ClosingPeriod 而没有特定的成员引用,这意味着调用 .CurrentMember。当您在 WHERE 子句中设置时,没有“当前”成员 - 有多个当前成员。将您的 MDX 重写为以下内容应该允许它与 WHERE 子句中的多个成员一起使用。

CREATE 
  MEMBER CURRENTCUBE.[MEASURES].Ultimo AS NULL;

SCOPE ([MEASURES].Ultimo);
      SCOPE ([Time].[Year - Month - Date].[All]);
        this = IIF
          (
            (NOT 
              [Measures].[LagerStk] = 0)
           ,Sum
            (
             NULL:Tail(Existing [Time].[Year - Week - Date].[Date],1).item(0).item(0)
             ,[Measures].[LagerStk]
            )
           ,NULL
          );
      END SCOPE;

      SCOPE ([Time].[Year - Week - Date].[All]);
        this = IIF
          (
            (NOT 
              [Measures].[LagerStk] = 0)
           ,Sum
            (
             NULL:Tail(Existing [Time].[Year - Month - Date].[Date],1).Item(0).Item(0)
             ,[Measures].[LagerStk]
            )
           ,NULL
          )
        ); 
     END SCOPE;
END SCOPE;

我在两个维度的所有成员上使用 SCOPE,这应该很快,out IIF 并且还将避免对 .CurrentMember 的一次引用。然后我用Tail(Existing [Time].[Year - Week - Date].[Date],1).item(0).item(0)替换了ClosingPeriod()调用,这样做是为了获取日期集当前上下文中存在的成员,Tail() 调用然后将这些中的最后一个作为单个成员集获取,并且 .Item(0).Item(0) 调用从该集合的第一个元组中获取第一个成员。

显然,无法访问您的多维数据集,我无法测试任何这些。您在评论中报告的问题可能与对所有成员的错误引用有关(我可能与您的多维数据集中的命名格式不同),也可能与 IIF() 语句有关。我不确定是否在正确的上下文中评估了对 0 的检查

您可以尝试不使用 IIF() 进行测试

创建成员CURRENTCUBE.[MEASURES].Ultimo AS NULL;

范围([措施].Ultimo);范围([时间].[年-月-日].[全部]);this = Sum ( NULL:Tail(现有 [时间].[年 - 周 - 日期].[日期],1).item(0).item(0) ,[Measures].[LagerStk] ); 结束范围;

  SCOPE ([Time].[Year - Week - Date].[All]);
    this = Sum
        (
         NULL:Tail(Existing [Time].[Year - Month - Date].[Date],1).Item(0).Item(0)
         ,[Measures].[LagerStk]
        ); 
 END SCOPE;

结束范围;

于 2009-02-04T03:54:34.707 回答