MDX distinctcount条件计算

时间:2014-04-08 07:05:44

标签: ssas mdx

我在MDX中真的很新,并且无法计算结果。我正在使用SSAS 2012并在Visual Studio中设计我的多维数据集。这是我目前的查询:

WITH MEMBER [DocCount] AS
  IIF(([Measures].[Responsible Count] > 0 AND [Measures].[Responsible2 Count] > 0),
       [Measures].[DocName]*0.5, [Measures].[DocName]) 

SELECT {[DocCount]} ON 0, [Analysis Table].[Responsible].MEMBERS ON 1
FROM [database]

SQL表就是这个

ID    DocName    Responsible   Responsible2
1     100001     John Doe      Mary Jane
2     100001     Mary Jane     John Doe
3     100002     Mike Doe      NULL
4     100003     John Doe      Mike Doe
5     100003     John Doe      Mike Doe
6     100004     Mary Jane     NULL

[Measures].[Responsible Count] is "count of non-empty values" selection in VS
[Measures].[Responsible2 Count] is "count of non-empty values" selection in VS
[Measures].[DocName] is "distinct count" selection in VS

我需要计算DISTINCTCOUNT DocName,但是当Responsible AND Responsible2不为null时,Count应为* 0.5。问题是聚合立方体数据,然后才评估我的[DocCount] IIF。目前的结果如下:

Responsible    DocCount
John Doe       1        --(2*0.5) because it distinct counts DocName and then *0.5 it
Mary Jane      1        -- (2*0.5) it does not care that ID 6 responsible2 is null
Mike Doe       1        -- (1) this is correct

我想要这个最终结果:

Responsible    DocCount
John Doe       1           --(0.5+0.5)  ID 1,2 and 4,5
Mary Jane      1.5         --(0.5 + 1)  ID 1,2 and 6
Mike Doe       1           --(1 )       ID 3 

如何修改我的查询以计算正确的结果?

2 个答案:

答案 0 :(得分:0)

解决这个问题的最佳方法是正确建模:

定义一个“负责任”维度,其中包含出现在Responsible2或Responsible2列中的每个人的一个条目,以及一个“Document”维度表,其中每个不同文档包含一行。这些维度表中的每一个都应该具有数字主键列,并且可以具有该人员的其他属性(可能是部门,性别,...)或文档的其他列(可能是名称,文件系统中的路径,创建日期,编号)页面,...)。

然后你会得到一个有三列的事实表:两个引用维表的主键的外键列,以及一个名为DocCount的度量列,它可能是1 / number of authors referenced by the document id(即一位作者为1,两位作者为0.5)。

然后你要做的就是基于此设置多维数据集。您不需要任何复杂的MDX计算,Analysis Services将根据多维数据集结构处理所有内容。这也允许使用任意数量的负责人,而不仅仅是一个或两个负责人。

可以使用您的设计在MDX中解决您的请求,但这需要一些稍微复杂的MDX。

答案 1 :(得分:0)

最后我自己做了解决方案。我用命名查询替换了我的事实表,其中我添加了额外的列,它将只找到DocName的不同行,并评估该行是否同时为Responsible和Responsible2为null。如果是 - 它将输入0.5,否则 - 1.然后,从该列中添加Measure并测试我的结果非常简单。