2012-11-02 48 views
1

我必须以奇怪的方式对某些事物进行计数,并且它在大多数情况下都有效 - 无论是在叶子上还是在多个维度上的更高聚合级别。但它没有给出一个特定维度的正确聚合值。SSAS中计算度量值聚合的不同扭曲

我目前所面对的是...

CREATE MEMBER CURRENTCUBE.[Measures].[Active Commitments] 
AS NULL, 
FORMAT_STRING = '#,#', 
VISIBLE = 1;  

SCOPE (DESCENDANTS([Date Dimension].[Fiscal Year Hierarchy],,AFTER));  
[Measures].[Active Commitments] = 
iif([Constituent Activity].[Type].currentMember.Properties("Name")="Correspondence", 
    sum(([Commitment Dates].[Start Date], NULL: [Date Dimension].[Fiscal Year Hierarchy]), [Measures].[Commitment Count]), 
    sum(([Commitment Dates].[First Funded Date], NULL: [Date Dimension].[Fiscal Year Hierarchy]), [Measures].[Commitment Count])) 
     - sum(([Commitment Dates].[Stop Date],[Commitment].[Was Commitment Ever Active].[Sometime Active], NULL: [Date Dimension].[Fiscal Year Hierarchy]), [Measures].[Commitment Count]); 
END SCOPE; 

SCOPE (DESCENDANTS([Date Dimension].[Fiscal Year Hierarchy],,AFTER)); 
<Similar to above> 

正如你所看到的,复杂的是,一种类型的“承诺”开始在[Start Date]和其他人在[First Funded Date]开始。

只要选择了多个成员[Constituent Activity],就会失败,因为在这种情况下,SCOPE语句中使用currentMember无效。例如,下面的MDX成功执行,但输出#Error -

select 
    [Measures].[Active Commitments] on columns 
    ,[Date Dimension].[Fiscal Year Hierarchy].[Fiscal Year].&[2011\12] on rows 
from Compass3 
where 
    {[Constituent Activity].[Description].[XYZ] 
    ,[Constituent Activity].[Description].[ABC]} 

我想我需要在SCOPE语句中编码为递归...

if a single member of [Constituent Activity] is current 
then use the calc as defined above 
else use [Measures].[Active Commitments] = sum(all selected members of [Constituent Activity], [Measures].[Active Commitments]) 

...但如何将我写这个?

回答

1

您是否一直控制回数据仓库/数据源视图?您可以将计算的字段添加到事实表中,因此您在单元级别具有[承诺活动日期]?然后你可以在立方体中做更简单的计数。

我发现执行业务规则和在数据仓库中进行业务计算从长远来看更加高效和容易。

+0

谢谢比尔。我确实拥有控制权,但它是一个既定的立方体,我继承了它,并试图尽可能接近表面以避免不必要的副作用。当前处理日期的结构非常复杂,因此添加另一个日期非常棘手。 – MattClarke