MDX深入查询生成

时间:2013-09-10 10:32:46

标签: mdx olap activepivot

我正在编写一些客户端代码以与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 个答案:

答案 0 :(得分:4)

您可以将DrilldownMember功能与 RECURSIVE 标志一起使用。

例如:

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
}