过滤多维 MDX 查询

Filtering Multi-Dimensional MDX Query

我有一个 MDX 查询可以驱动按预期工作的 Telerik 交叉表控件:

WITH MEMBER [Product].[Product Group Name].[Total] as [Product].[Product Group Name].[All]
select 
NON EMPTY{[Measures].[Annual Premium - Fact Distinct Transaction],
[Measures].[Fact Distinct Transaction Count],
[Measures].[API - Fact Distinct Transaction],
[Measures].[Fact New Members Count]} on columns,
NON EMPTY{
[Product].[Product Group Name].&[Protection],
[Product].[Product Group Name].&[Pension],
[Product].[Product Group Name].&[Savings and Investment],
[Product].[Product Group Name].&[Child Savings],
[Product].[Product Group Name].&[ISA],
[Product].[Product Group Name].[Total]
} on rows,
NON EMPTY{[Region Manager].[Full Name].Children} on 2
,
NON EMPTY{[Transaction Type].[Premium Frequency].&[S],[Transaction Type].[Premium Frequency].&[M]} on 3
from [Cube]
where (
    {StrToMember('[Effective Date].[Date].&[2015-01-01T00:00:00]'):StrToMember('[Effective Date].[Date].&[2015-09-01T00:00:00]')},
    StrToMember('[Transaction Type].[Transaction Description].[All].[Net Issued]'),
    [Adviser].[Status].&[A]
)

我被要求排除

WHERE [Product].[Product Group Name].&[Pension] AND [Transaction Type].[Premium Frequency].&[S] 

并尝试使用多个交叉连接,但解决方案似乎总是过于冗长,我相信有更简单的方法。

我发现最满意的方法是使用子立方体:

SELECT
    NON EMPTY{[Measures].[Annual Premium - Fact Distinct Transaction],
    [Measures].[Fact Distinct Transaction Count],
    [Measures].[API - Fact Distinct Transaction],
    [Measures].[Fact New Members Count]
    } on columns,
    NON EMPTY
    {
    [Product].[Product Group Name].&[Protection],
    [Product].[Product Group Name].&[Pension],
    [Product].[Product Group Name].&[Savings and Investment],
    [Product].[Product Group Name].&[Child Savings],
    [Product].[Product Group Name].&[ISA]
    } on rows,
    NON EMPTY{[Region Manager].[Full Name].Children} on 2,
    NON EMPTY{[Transaction Type].[Premium Frequency].&[S],[Transaction Type].[Premium Frequency].&[M]} on 3
    from
    (
        select
        EXCEPT(
        CROSSJOIN([Product].[Product Group Name].Children, UNION([Transaction Type].[Premium Frequency].&[M] , [Transaction Type].[Premium Frequency].&[S])),
        CROSSJOIN([Product].[Product Group Name].[Pension], [Transaction Type].[Premium Frequency].&[S])
        )on 0
        from [Cube]
    )

WHERE (
    {StrToMember('[Effective Date].[Date].&[2015-01-01T00:00:00]'):StrToMember('[Effective Date].[Date].&[2015-09-01T00:00:00]')},
    StrToMember('[Transaction Type].[Transaction Description].[All].[Net Issued]'),
    [Adviser].[Status].&[A]
)

这意味着 "Total" 数字需要通过第二个交叉表获得,该交叉表使用相同的查询对整个集合进行分组,而不是作为一个单独的成员。