我正在编写一些客户端代码来与 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]
现在,对于像上面这样的更简单的查询,我可以在基本查询中定义一个替换点,并将向下钻取的路径注入(inject)其中。例如,上述的基本查询是:
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 本身定义了一些标准机制来根据您传递的一些参数提供向下钻取查询。但是,我一直没能找到这样的东西。
因此,我担心我唯一的办法就是自己解析查询并将向下钻取信息动态注入(inject) AST,然后生成新查询。谁能证实这一点,或提供替代方法?
最佳答案
您可以使用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
}
关于MDX 深入查询生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18716581/