web-dev-qa-db-fra.com

Filtre de membre calculé MDX par attribut de dimension

Je veux créer un membre calculé et le filtrer par dimension. Ceci est un exemple de travail:

(
    [Policy].[Policy Status].&[Void], 
    [Policy].[Tran Type].&[Renewal], 
    [Measures].[FK Policy Distinct Count]
)

Mais si je veux le filtrer comme ça

(
    [Policy].[Policy Status].&[Void], 
    [Policy].[Policy Status].&[Policy],  
    [Measures].[FK Policy Distinct Count]
)

Alors ça ne fonctionne PAS. Il indique que la même hiérarchie s'affiche plusieurs fois dans le tuple.

Une autre chose est, comment exclure des lignes? Voici l'idée ...

(
    ![Policy].[Policy Status].&[Void], 
    ![Policy].[Policy Status].&[Policy],  
    [Measures].[FK Policy Distinct Count]
)
14
ilija veselica

Tout d'abord, il est important de comprendre la syntaxe MDX et sa relation avec les concepts de tuples, membres et ensembles .

Tuples

L'utilisation de parenthèses indique un tuple:

(
  [Policy].[Policy Status].&[Void], 
  [Policy].[Tran Type].&[Renewal], 
  [Measures].[FK Policy Distinct Count]
)

Un tuple ne peut inclure qu'un seul membre de n'importe quelle hiérarchie.

Ensembles

Pour récupérer les résultats de plusieurs membres de la même hiérarchie, vous devez rechercher un ensemble. Un ensemble MDX est désigné par des accolades:

{
  [Policy].[Policy Status].&[Void], 
  [Policy].[Policy Status].&[Policy]
}

Un ensemble est, par définition ,

une collection ordonnée de zéro, un ou plusieurs tuples.

Donc, si vous souhaitez demander le [FK Policy Distinct Count] mesure contre ces deux membres, les tuples de l'ensemble doivent chacun inclure la mesure:

{
  ( [Policy].[Policy Status].&[Void],   [Measures].[FK Policy Distinct Count] ), 
  ( [Policy].[Policy Status].&[Policy], [Measures].[FK Policy Distinct Count] )
}

Pour simplifier cette expression, il est possible de crossjoin deux ensembles de dimensionnalité différente:

{
  [Policy].[Policy Status].&[Void],
  [Policy].[Policy Status].&[Policy], 
  [Policy].[Policy Status].&[Something], 
  [Policy].[Policy Status].&[Something else], 
  [Policy].[Policy Status].&[Yet another member]
}
*
{
  [Measures].[FK Policy Distinct Count]
}

Exclusion de lignes

Maintenant que nous pouvons définir des ensembles, il est temps d'en supprimer certains membres. Dans votre exemple, il semble que vous souhaitiez commencer par un niveau (qui, pour le moteur MDX, n'est qu'un ensemble prédéfini dans le cube qui inclut chaque membre à ce niveau de la hiérarchie), et exclure certains membres. MDX a beaucoup de fonctions qui fonctionnent sur des ensembles, et nous allons utiliser EXCEPT.

La fonction EXCEPTprend deux paramètres , le premier étant l'ensemble à supprimer, et le second étant l'ensemble qui doit être supprimé du premier. Il renvoie un ensemble.

Dans cet exemple, je vais supposer que [Policy].[Policy Status] est une hiérarchie d'attributs et que son seul niveau a le nom unique de [Policy].[Policy Status].[Policy Status].

EXCEPT(
  [Policy].[Policy Status].[Policy Status],
  {
    [Policy].[Policy Status].&[Void],
    [Policy].[Policy Status].&[Policy]
  }
)

Cela renverra chaque membre du [Policy].[Policy Status].[Policy Status] niveau, sauf pour [Policy].[Policy Status].&[Void] et [Policy].[Policy Status].&[Policy].

Pour obtenir des résultats utiles, nous pouvons croiser le résultat par une mesure:

EXCEPT(
  [Policy].[Policy Status].[Policy Status],
  {
    [Policy].[Policy Status].&[Void],
    [Policy].[Policy Status].&[Policy]
  }
)
*
{
  [Measures].[FK Policy Distinct Count]
}

Utilisation d'un ensemble en tant que membre unique

Les ensembles sont agréables, mais parfois tout ce que nous voulons d'eux est de les traiter comme un seul membre, comme dans votre exigence de membre calculée. Pour ce faire, nous devons utiliser une fonction d'agrégation. Les fonctions d'agrégation acceptent un ensemble et renvoient un membre qui représente l'ensemble.

Il y en a plusieurs, et la bonne à utiliser dépend des données stockées dans votre cube: MIN, MAX, COUNT et SUM en sont quelques-uns (voir "Fonctions numériques" dans la référence de la fonction MDX pour une liste plus complète). Dans cet exemple, je suppose que vos agrégats de dimension utilisent SUM:

SUM(
  EXCEPT(
    [Policy].[Policy Status].[Policy Status],
    {
      [Policy].[Policy Status].&[Void],
      [Policy].[Policy Status].&[Policy]
    }
  ),
  [Measures].[FK Policy Distinct Count]
)

Ici, j'ai passé la mesure à agréger comme deuxième paramètre à SUM.


MDX est un langage complexe qui prend en charge de nombreuses opérations d'ensemble courantes et peu communes. Si vous ne l'avez pas déjà fait, je vous conseille de prendre le temps de lire la documentation disponible en ligne ou de vous procurer un bon livre MDX. Il y a beaucoup à savoir :)

<3

47
Tullo_x86

Essayez cette syntaxe:

SUM({[Policy].[Policy Status].&[Void], [Policy].[Policy Status].&[Policy]}, [Measures].[FK Policy Distinct Count])
2
Noe Zavala