我有以下问题。如果我使用一个函数的关键图来查询值,我不能指定相同维度限制的多个值,但如果它不是一个函数,它就可以工作。
这样可行:
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子句,但我真的很喜欢这个解决方案,因为它很简单。
Calucated功能是:
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企业版上。
答案 0 :(得分: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
答案 1 :(得分: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,这应该快于IIF并且也将避免对.CurrentMember的一个引用。然后我用 Tail(现有[时间]。[年 - 周 - 日期]。[日期],1).item(0).item(0)替换 ClosingPeriod()调用这样做是为了获取当前上下文中存在的日期成员集,然后Tail()调用将这些成员的最后一个作为单个成员集和.Item(0).Item(0) )调用从该集合的第一个元组中获取第一个成员。
显然,无法访问您的多维数据集,我无法测试任何此类。您在评论中报告的问题可能与对所有成员的错误引用有关(我可能与您的多维数据集中的成员有不同的命名格式),或者它可能与IIF()语句有关。我不确定是否在正确的上下文中评估0的检查
您可以尝试不使用IIF()
进行测试CREATE MEMBER CURRENTCUBE。[MEASURES] .Ultimo AS NULL;
SCOPE([MEASURES] .Ultimo); 范围([时间]。[年 - 月 - 日]。[全部]); 这=总和 ( NULL:Tail(现有[Time]。[Year - Week - Date]。[Date],1).item(0).item(0) ,[措施]。[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;
结束范围;