Filter 如何使用MDX筛选函数按名称排除特定成员

Filter 如何使用MDX筛选函数按名称排除特定成员,filter,mdx,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 我想做的是排除一

我需要一个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
我想做的是排除一组像这样的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成员的正确语法是什么?

我相信您不需要()任何东西

第一个用例可以重写为:

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

希望能有所帮助。

MarcP已经给了您答案,但另一个有趣的可能性是
子选择。这会将您的策略ID汇总到该层次结构的所有成员中

下面是一个针对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;

(upped)可能值得添加第二个脚本的
版本,但第二个脚本的
版本除外:我认为它更明确,更容易理解。感谢各位的回复,这非常有用。然而,我想做的不是排除一个我已经知道的特定ID,而是一组不同维度的ID[PolicyB]。PolicyB有[Policy ID]和[Policy Date]成员。所以我想做的是从Policy Exect中为Policy B中的任何ID为所选日期选择Policy ID。@BillyWinter您的问题只使用一个维度<代码>[策略]。
。如果这是错误的,请更改问题。问题的关键部分显示[PolicyB]维度:[Policy].[Policy ID]。名称****不在[PolicyB].[Policy ID]中。所有成员****