SSAS数据立方体中的百分比

时间:2014-03-25 11:50:33

标签: sql-server ssas mdx olap olap-cube

所以我有一个名为Attendance Mark的维度,其中包含字符串,例如'PRESENT'。我有一个衡量总参赛人数的“考勤计数”。我想出了这个(受谷歌搜索的很大启发)MDX计算,以获得出席'PRESENT'的出勤标记条目的百分比:

Case
  When IsEmpty ([Measures].[Attendance Count])
  Then NULL
  Else ( [Attendance Mark].[Attendance Mark].&[PRESENT],
    [Measures].[Attendance Count]) /
  (  [Attendance Mark].[Attendance Mark],
    [Measures].[Attendance Count] )
End

这似乎工作以为我对它没有100%的信心,但如果我通过Mark维度查看该度量,则会得到非常奇怪的结果。正如您所期望的那样,PRESENT显示为100%,但您希望其他显示为0% - 因为其范围内有0个“PRESENT”值。相反,它们显示的是865.29%,1338.17%或169.76%。完全错误的数据。

我出错的任何想法?

P.S显然,你从未在实际使用中用标记维度显示百分比度量,但我不希望它混淆用户,并且理解为什么会发生这种情况会很有用。

1 个答案:

答案 0 :(得分:1)

我将问题分解为三个简单的部分:分子,分母和最后一个百分比。

诀窍在于,您希望计算尊重[考勤标记]的所有[PRESENT]和非[PRESENT]成员以及[All]成员。因此,[PRESENT]应为100%,非[PRESENT]应为null,[All]应为[PRESENT]占总数的百分比。

with
    member [Measures].[x] as
        aggregate(
            exists(
                {[Attendance Mark].[Attendance Mark].&[PRESENT]},
                {[Attendance Mark].[Attendance Mark].CurrentMember}
            ), [Measures].[Attendance Count]
        )
    member [Measures].[y] as
        aggregate(
            exists(
                {[Attendance Mark].[Attendance Mark].CurrentMember},
                {[Attendance Mark].[Attendance Mark].&[PRESENT]}
            ), [Measures].[Attendance Count]
        )
    member [Measures].[z] as
        [Measures].[x] / [Measures].[y], format_string = 'Percent'
select
    {[Measures].[Attendance Count], [Measures].[x], [Measures].[y], [Measures].[z]} on 0,
    non empty [Attendance Mark].[Attendance Mark].Members on 1
from
    [cube]

其中[Measures].[x]代表分子,[Measures].[y]代表分母,[Measures].[z]代表最终百分比计算。您显然可以一步完成。为了清楚起见,我将其分解出来。