首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MDX where子句中的多维限制

MDX where子句中的多维限制
EN

Stack Overflow用户
提问于 2008-12-15 17:59:24
回答 2查看 8.7K关注 0票数 0

我有以下问题。如果我查询值的关键字是一个函数,我不能指定相同尺寸限制的多个值,但如果它不是一个函数,它就可以工作。

所以这是可行的:

代码语言:javascript
运行
复制
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])})

但这不是:

代码语言:javascript
运行
复制
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])})

这也是可行的:

代码语言:javascript
运行
复制
SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where 
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00])})

我猜解决方案类似于在头文件中添加where子句,但我真的很喜欢这个解决方案,因为它非常简单。

计算出的函数是:

代码语言:javascript
运行
复制
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企业版上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-12-16 16:41:04

好的,这行得通:

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2009-02-04 03:54:35

问题出在您的计算度量中。您使用的.CurrentMember和ClosingPeriod没有特定的成员引用,这意味着要调用.CurrentMember。如果在WHERE子句中进行了设置,则没有“当前”成员-有多个当前成员。将MDX重写为类似下面的内容应该允许它与WHERE子句中的多个成员一起工作。

代码语言:javascript
运行
复制
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;

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

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

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

创建成员CURRENTCUBE.MEASURES.Ultimo为NULL;

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

代码语言:javascript
运行
复制
  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;

结束范围;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/369198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档