如何使用MDX筛选器功能按名称排除特定成员

时间:2014-12-04 22:34:59

标签: filter mdx

我需要一个MDX查询来显示几组数据,并使用过滤器排除某些ID号。 例如,此查询将仅包含一个ID号

SELECT [Measures].[Gross Amt] ON COLUMNS,
FILTER( 
   [Policy].[Policy Name].[Policy Name]
*  [Policy].[Policy ID].[Policy ID],
[Policy].[Policy ID].Name = "622743"
)
ON ROWS
FROM EXPOSURE

我想要做的是EXLUDE一组像这样的ID

SELECT [Measures].[Gross GAAP Par OS Amt] ON COLUMNS,
FILTER( 
   [Policy].[Policy Name].[Policy Name]
*  [Policy].[Policy ID].[Policy ID],
[Policy].[Policy ID].Name 
    ****NOT IN [PolicyB].[Policy ID].AllMembers****
)
ON ROWS
FROM EXPOSURE

排除PolicyB成员的正确语法是什么?

2 个答案:

答案 0 :(得分:3)

我相信你不需要Filter()任何东西。

第一个用例可以改写如下:

SELECT 
  [Measures].[Gross Amt] ON COLUMNS, 
  { [Policy].[Policy Name].[Policy Name] } * { [Policy].[Policy ID].[622743] } ON ROWS 
FROM EXPOSURE

对于要排除的ID集,您可以使用 - 运算符:

SELECT 
  [Measures].[Gross Amt] ON COLUMNS, 
  { [Policy].[Policy Name].[Policy Name] } * ( [Policy].[Policy ID].members - { [Policy].[Policy ID].[622743], ... } ) ON ROWS 
FROM EXPOSURE

希望有所帮助。

答案 1 :(得分:1)

MarcP给了你答案,但另一个有趣的可能性是sub-select。这会将您的策略​​ID汇总到该层次结构的All成员中。

以下是针对AdvWks多维数据集的示例:

SELECT 
  [Date].[Calendar Year].[Calendar Year] ON 0
 ,
  {[Customer].[Customer].MEMBERS} * {[Measures].[Internet Sales Amount]} ON 1
FROM 
(
  SELECT 
    [Customer].[Customer].&[20075] ON 0
  FROM [Adventure works]
);

因此适用于您的场景:

SELECT 
  [Measures].[Gross Amt] ON COLUMNS
 ,
  {[Policy].[Policy Name].[Policy Name]} * {[Policy].[Policy ID].MEMBERS} ON ROWS
FROM 
(
  SELECT 
    [Policy].[Policy ID].[622743] ON 0
  FROM EXPOSURE
);

然后以比使用-运算符更明显的方式排除我建议使用EXCEPT

SELECT 
  [Measures].[Gross Amt] ON COLUMNS
 ,
  {[Policy].[Policy Name].[Policy Name]} * {[Policy].[Policy ID].MEMBERS} ON ROWS
FROM 
(
  SELECT 
    Except
    (
      [Policy].[Policy ID].MEMBERS
     ,[Policy].[Policy ID].[622743]
    ) ON 0
  FROM EXPOSURE
);

以下(我认为)与Marc的第二个脚本完全相同,只是语法不同:

SELECT 
  [Measures].[Gross Amt] ON COLUMNS
 ,
    {[Policy].[Policy Name].[Policy Name]}
  * 
    Except
    (
      [Policy].[Policy ID].MEMBERS
     ,{[Policy].[Policy ID].[622743]}
    ) ON ROWS
FROM EXPOSURE;

进一步的想法是,您还可以在层次结构中添加一个成员,代表所有类似于此的集合:

WITH 
  MEMBER [Policy].[Policy ID].[All excl 622743] AS 
    Aggregate
    (
      Except
      (
        [Policy].[Policy ID].MEMBERS
       ,{[Policy].[Policy ID].[622743]}
      )
    ) 
SELECT 
  [Measures].[Gross Amt] ON COLUMNS
 ,
    {[Policy].[Policy Name].[Policy Name]}
  * 
    [Policy].[Policy ID].[All excl 622743] ON ROWS
FROM EXPOSURE;