代码之家  ›  专栏  ›  技术社区  ›  Jon Seigel

具有共享维度的多个度量之间的差异计数篮分析

  •  1
  • Jon Seigel  · 技术社区  · 12 年前

    假设我有一个立方体,它有两个不同的计数度量,称之为 Measure1 Measure2 这两种度量都包含一个共同的维度, Dimension1 ,这两个指标都计算在内。

    我需要做的是返回一个不同的计数 尺寸1 两者都存在的成员 测量1 测量2 ,在根据需要对每个度量进行适当过滤之后。

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

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

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

    老实说,我不知道从哪里开始。谷歌没有发现这样的结果(我看到一些篮子分析内容涉及一个单一的衡量标准,但我不确定是否或如何将其应用于我的场景)。无论如何,我都不是SSAS/MDX/BI专家。

    我可以想到两种选择:

    1. 使用 DRILLTHROUGH 使用单个MDX查询和(本质上) COUNT DISTINCT 结果。
    2. 在数据仓库源数据库上使用T-SQL。(可能很难有效地解释所有情况。)

    我们确实需要能够钻取,所以我可能无论如何都必须实现解决方案#1,但最好有一种更有效的方法来只获取计数,因为需要计数 远的 更频繁。

    4 回复  |  直到 12 年前
        1
  •  0
  •   Mike Honey    12 年前

    我会添加一个基于Dimension1 Key属性的Distinct Count度量。我会在Excel 2010+中使用Sets MDX功能来过滤Measure1、2等。

        2
  •  0
  •   Jon Seigel    12 年前

    我从来没有为此找到MDX解决方案。

    我提出了一个直接查询数据仓库的解决方案,经过一些性能调整,到目前为止它运行得很好。这种方法可能不适用于所有应用程序,但看起来它适用于我们的特定场景。

        3
  •  0
  •   Denis Glukhov    6 年前

    我会在SQL Server端(从两个表创建视图)或在SSAS端(创建一个度量值,但使用来自不同源的不同分区(例如,Partition1-用于Credits,Partition2-用于Deposits))重新修复并集函数。

    第二种方式,草签一下你需要做出的这个“可怕”的决定 使用SUM函数的简单Measure1。然后,点击Measure1并使用DistionctCount函数选择“创建新度量”。 因此,SSAS将使用DistionctCount函数与Measure2创建一个单独的新Measure Group。

    它必须完美工作。

        4
  •  -1
  •   MoazRub    6 年前

    让我们简化问题陈述。你需要同时购买面包和鸡蛋的顾客数量,或者拥有丰田和本田的顾客数量。很久以前我就遇到过这个问题,并提出了一个查询设计。这些查询的性能不好。根据这些查询的性质,它们正在向粒度级别打开事实。因此失去了所有的利益。

    这是代码,我根据客户的姓名计算他们的订单 ClassicVess或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