MDX 向下钻取查询生成

Posted

技术标签:

【中文标题】MDX 向下钻取查询生成【英文标题】:MDX Drill-Down Query Generation 【发布时间】:2013-09-10 10:32:46 【问题描述】:

我正在编写一些客户端代码以与 ActivePivot 集成。作为其中的一部分,我需要能够处理向下钻取请求并在将其提交到服务器之前生成经过适当修改的 MDX 查询。

这是一个使用 ActivePivot 沙盒立方体的简单示例。假设基本查询是:

SELECT

    Hierarchize
    (
        
            [Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember],
            [Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children
        
    )
 ON COLUMNS,

    Hierarchize
    (
        
            [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember],
            [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children
        
    )
 ON ROWS
FROM [EquityDerivativesCube]

当用户深入研究“2M”时,我需要生成:

SELECT

    Hierarchize
    (
        
            [Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember],
            [Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children
        
    )
 ON COLUMNS,

    Hierarchize
    (
        
            [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember],
            [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children,
            [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].[2M].Children
        
    )
 ON ROWS
FROM [EquityDerivativesCube]

现在,对于像上面那些更简单的查询,我可以在基本查询中定义一个替换点,并将向下钻取的路径注入其中。例如,上面的基本查询是:

SELECT

    Hierarchize
    (
        
            0
        
    )
 ON COLUMNS,

    Hierarchize
    (
        1
    )

ON ROWS FROM [EquityDerivativesCube]

(显然,替换点需要转义大括号,但你明白了)

但是对于更复杂的查询,例如在一个轴上有多个成员的查询,这种方法很快就会失效。例如,这是一个在列维度上有两个成员的查询:

SELECT
Hierarchize(
    Union(
        CrossJoin(
            [Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember],
             [Underlyings].[DEFAULT_HIERARCHY].[ALL].[AllMember]
        ),
         Union(
            CrossJoin(
                [Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember],
                 [Underlyings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children
            ),
             Union(
                CrossJoin(
                    [Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children,
                     [Underlyings].[DEFAULT_HIERARCHY].[ALL].[AllMember]
                ),
                 CrossJoin(
                    [Bookings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children,
                     [Underlyings].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children
                )
            )
        )
    )) 
ON COLUMNS,
Hierarchize(
    [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember],
     [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children) 
ON ROWS
FROM [EquityDerivativesCube]

我需要能够检测针对任何可钻取成员的钻取请求,并在重新提交之前相应地修改查询。

所以我想知道如何去做这件事?我最初的希望是 MDX 本身定义了一些标准机制,以根据您传递的一些参数提供向下钻取查询。但是,我一直找不到这样的东西。

因此,我担心我唯一的办法是自己解析查询并将向下钻取信息动态注入 AST,然后生成新查询。谁能证实这一点,或提供替代方法?

【问题讨论】:

【参考方案1】:

您可以使用带有 RECURSIVE 标志的 DrilldownMember 函数。

例如:

DrilldownMember( [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember],  [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember], [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].[2M], RECURSIVE)

它将返回与

相同的成员

    [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember],
    [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].Children,
    [TimeBucket].[DEFAULT_HIERARCHY].[ALL].[AllMember].[2M].Children

【讨论】:

谢谢 - 我可以看到这对简单查询有何帮助,但我看不出它如何应用于更复杂的查询。我已经更新了我的问题以包含一个示例。您能否看一下并评论/更新您的答案? 在尝试了更多之后,我认为我需要做的是使用CrossJoin(不需要Union - 那只是由我使用的工具生成的using) 对维度的每个成员进行一次DrilldownMember 调用。所以我会维护一组成员来向下钻取每个维度成员。当用户深入研究成员时,我会添加到适当的集合中并相应地生成查询。当他们向上钻取时,我会从适当的集合中删除。很想听听您对这种方法的看法。

以上是关于MDX 向下钻取查询生成的主要内容,如果未能解决你的问题,请参考以下文章

数据库向下钻取

在报表生成器中添加向下钻取到辅助报表

在 MDX (s-s-rS) 中执行钻取/在一个一致的维度上连接两个事实表

访问对象属性(在没有数组转换的情况下向下钻取)[重复]

子报表在 Matrix 上未按预期工作,具有向下钻取功能

ASP 图表、年、月、日向下钻取