具有共享维度的多个度量之间的DISTINCT COUNT篮子分析

时间:2013-03-08 18:11:41

标签: sql-server ssas mdx

假设我有一个包含两种不同计数度量的多维数据集,请将它们称为Measure1Measure2。这两个度量都包含一个共同维度Dimension1,它由两个度量计算。

我需要做的是在对每个度量进行适当过滤后,返回Dimension1Measure1 中存在的Measure2个成员的明显计数必需的。

我可以单独为Measure1Measure2定义MDX查询并获取不同的计数,但我需要能够“重叠”结果以避免重复计算两者中存在的成员集。

注意:在实际场景中,涉及的方法超过2个,所有MDX查询都将动态构建(用户定义包含哪些度量和维度标准)。

可以在SSAS / MDX中完成吗?如果没有,是否有其他Microsoft工具/功能可以?系统的最低要求是SQL Server 2008 R2标准版。

老实说,我不知道从哪里开始。谷歌出现了这样的事情(我看到一些涉及单一措施的篮子分析,但我不确定是否或如何将其应用于我的场景)。无论如何,我不是SSAS / MDX / BI专家。

我可以想到两种选择:

  1. 使用DRILLTHROUGH使用各个MDX查询和(基本上)COUNT DISTINCT结果。
  2. 在数据仓库源数据库上使用T-SQL。 (可能很难有效地考虑所有情况。)
  3. 我们确实需要能够进行钻取,所以我可能不得不实施解决方案#1,但是有一个更有效的方法来获得计数会更好,因为需要计数更频繁。

4 个答案:

答案 0 :(得分:0)

我会根据Dimension1 Key属性添加一个Distinct Count度量。我会在Excel 2010+中使用Sets MDX功能在Measure1,2等上进行过滤。

答案 1 :(得分:0)

我从未找到过这方面的MDX解决方案。

我继续使用直接查询数据仓库的解决方案,并且经过一些性能调整后,它的工作进展顺利。这种方法可能并不适合所有应用程序,但看起来它适用于我们的特定场景。

答案 2 :(得分:0)

我会建议在SQL Server端(创建两个表的表视图)或SSAS端(创建单个度量,但具有来自不同来源的不同分区的联合功能)(例如,Partition1-for Credits,Partition2-for存款)。

第二种方法,是对您需要做出的“可怕”决定进行初步 使用SUM函数的简单Measure1。然后,单击Measure1并使用DistionctCount函数选择“创建新度量”。 因此,SSAS将使用DistionctCount函数与Measure2组成一个单独的新Measure Group。

它必须完美运行。

答案 3 :(得分:-1)

让我们简化问题陈述。您想要同时购买面包和鸡蛋或拥有丰田和本田的客户数量。我很久以前就遇到了这个问题,并提出了一个查询设计。这些查询的性能不佳。通过这些查询的性质,他们正在将事实公开化。因此,所有的集结收益都丧失了。

这是代码,我根据客户的姓名计算客户的数量 ClassicVestS或HLMountainTire等产品

with  
member [Measures].[CustomersWhoBoughtClassicVestS] as 
count(
intersect(
{nonempty(
existing ([Customer].[Customer].children),[Measures].[Internet Order Count]
)},
{extract(nonempty( ([Customer].[Customer].children* [Product].[Product].&[471]),[Measures].[Internet Order Count]),[Customer].[Customer])}
)
) 
member [Measures].[CustomersWhoBoughtHLMountainTire] as 
count(
intersect(
{nonempty(
existing ([Customer].[Customer].children),[Measures].[Internet Order Count]
)},
{extract(nonempty( ([Customer].[Customer].children* [Product].[Product].&[537]),[Measures].[Internet Order Count]),[Customer].[Customer])}
)
) 
Select {[Measures].[CustomersWhoBoughtClassicVestS],[Measures].[CustomersWhoBoughtHLMountainTire] 
} on columns , 
{ nonempty( [Product].[Product].children 
,[Measures].[Internet Order Count]) } 
on rows 
from [Adventure Works]

Result