Les 3 premiers sous-jacents par pays

Vous connaissez peut-être la fonction TopCount, qui est très utile pour ne conserver que les membres avec les valeurs les plus élevées. Imaginez maintenant que dans votre cube, vous avez les dimensions Sous-jacents et Géographie et que pour chaque région, vous voulez récupérer les 3 sous-jacents qui ont le meilleur compte de résultat.

La fonction TopCount seule ne suffit pas et il faudra utiliser la fonction Generate. Elle joue le rôle de boucle For.

Voici la requête MDX qui fera ce que vous souhaitez :

SELECT NON EMPTY Generate ( [Geography].[Region].MEMBERS, TopCount ( {[Geography].CurrentMember} * [Underlying].[ALL].[AllMember].Children, 3, [Measures].[TotalPnl.SUM] ) ) ON ROWS, {[Measures].[TotalPnl.SUM]} ON COLUMNS FROM [PnlCube]

Voici comment additionner le total par région :

SELECT NON EMPTY Generate ( [Geography].[Region].MEMBERS, { {([Geography].CurrentMember, [Underlying].[ALL].[AllMember])}, TopCount ( {[Geography].CurrentMember} * [Underlying].[ALL].[AllMember].Children, 3, [Measures].[TotalPnl.SUM] ) } ) ON ROWS, {[Measures].[TotalPnl.SUM]} ON COLUMNS FROM [PnlCube]

generate top count

go to top
Top

Les comptes qui représentent 80 % de la VAR

La fonction TopCount affiche le nombre précisé d'éléments avec les valeurs les plus élevées. Mais dans certains cas, vous voudrez récupérer les membres avec les valeurs les plus élevées et qui contribuent à un pourcentage X du total cumulé.

Il existe une fonction MDX pour cela : TopPercent.

La requête suivante récupère les comptes avec la VAR la plus élevée qui contribue à 80 % de la VAR de l'ensemble des comptes.

SELECT { {[Book].[ALL].[AllMember]}, TopPercent ( [Book].[ALL].[AllMember].Children, 80, [Measures].[historical.VaR] ) } ON ROWS FROM [VarCube] WHERE [Measures].[historical.VaR]

Top per cent

go to top
Top

Évolution du chiffre d'affaires journalier

Avec les fonctions MDX comme PrevMember et NextMember, vous pouvez écrire des formules pour comparer les valeurs de mesures entre 2 jours/semaines/mois/années.

Par exemple :

( [Measures].[Turnover.SUM]/ ([Measures].[Turnover.SUM], [Time].CurrentMember.PrevMember) - 1 ) * 100

[Measures].[Turnover.SUM] a la même valeur que ([Measures].[Turnover.SUM], [Time].CurrentMember) qui est le chiffre d'affaires du membre actuel sur la dimension Temps.

([Measures].[Turnover.SUM], [Time].CurrentMember.PrevMember) est le chiffre d'affaires du membre qui précède le membre actuel sur la dimension Temps. L'expression produit la croissance relative entre les 2 membres.

Si vous écrivez [Time].[Day].Members sur l'un des axes, vous obtiendrez l'évolution du chiffre d'affaires journalier. Si vous écrivez [Time].[Month].Members sur l'un des axes, vous obtiendrez l'évolution du chiffre d'affaires mensuel.

La dernière requête MDX se présentera de la manière suivante :

WITH MEMBER [Measures].[Daily Turnover Change] AS IIF ( [Time].CurrentMember.PrevMember IS NULL, NULL, ( [Measures].[Turnover.SUM]/ ([Measures].[Turnover.SUM], [Time].CurrentMember.PrevMember) -1 ) * 100 ) SELECT NON EMPTY [Time].[Day].MEMBERS ON ROWS FROM [Amazon] WHERE [Measures].[Daily Turnover Change]

previous member

L'expression IIf est utilisée pour gérer la valeur de la formule pour le premier jour. [Time].CurrentMember.PrevMember n'existe pas pour le premier jour et sera NULL.

go to top
Top

Comment calculer les différences au jour le jour

Cette section explique comment utiliser les membres calculés de MDX pour calculer les différences entre des membres adjacents. Un exemple type serait l'évolution du delta ou compte de résultat d'une date ouvrée à la suivante.

Le nouveau moteur MDX permet ce calcul avec MDX en remplacement de la méthode traditionnelle de post-traitement. L'exemple suivant peut être déployé au projet Sandbox en faisant un copier-coller des requêtes MDX suivantes dans l'éditeur de requêtes de ActiveUI.

Cette capture d'écran présente un membre calculé de MDX appelé DIFF, évalué comme étant la différence en delta.SUM d'un membre à l'autre dans la dimension Dates.

diff

Le point important est la définition de l'instruction MDX d'un membre calculé (la clause WITH MEMBER) appelé DIFF. Il s'agit de la différence entre la valeur actuelle et la valeur précédente et comme le montre la capture d'écran, elle est générique car elle fonctionne non seulement pour T par rapport à T-1, mais aussi pour T-1 par rapport à T-2 et fonctionne pour toutes les paires de membres sur la dimension Date.

Une autre fonction intéressante est la clause FORMAT dans la requête ; la capture d'écran montre comment ActivePivot respecte cette directive de formatage. Un petit élément pourtant très important pour une présentation lisible des données.

WITH MEMBER [Measures].[DIFF] AS IIF ( [HistoricalDates].CurrentMember.PrevMember IS NULL, NULL, [Measures].[delta.SUM] - ( [Measures].[delta.SUM], [HistoricalDates].CurrentMember.PrevMember ) ), FORMAT = "#,###.00" SELECT NON EMPTY { [Measures].[DIFF], [Measures].[delta.SUM] } ON ROWS, NON EMPTY Hierarchize ( {[HistoricalDates].[AsOfDate].MEMBERS} ) ON COLUMNS FROM [EquityDerivativesCube]

go to top
Top

Mesure sous forme de formule mathématique pour le formatage

Il est possible d'ajouter des mesures avec une formule mathématique comportant des opérateurs et des opérandes (expressions scalaires ou autres mesures).

Par exemple :

/* Full VaR = Square root of sum of Square of historical VaR and Square of stress VaR */

autrement dit :

fullVaR = (historicalVaR^2 + stressVaR^2) ^ (1/2)

Nous voulons également formater le résultat avec une précision à 2 décimales près et un séparateur au millième près, comme par exemple 1 123 456,89

La requête MDX se présentera de la manière suivante :

WITH /* full value-at-risk combining historical and stress values */ MEMBER [Measures].[fullVaR] AS ([Measures].[historical.VaR] ^ 2 + [Measures].[stress.VaR] ^ 2) ^ 0.5, FORMAT = '#,###.##' SELECT NON EMPTY Hierarchize ( {DrillDownLevel({[ProfitCenter].[ALL].[AllMember]})} ) ON ROWS, NON EMPTY { [Measures].[historical.VaR], [Measures].[stress.VaR], [Measures].[fullVaR] } ON COLUMNS FROM [VarCube]

MDX formula

go to top
Top

Filtrage de valeurs de mesures

Nous pouvons filtrer les membres en fonction d'un ensemble de conditions sur des valeurs de mesures avec la fonction IIF et des opérateurs tels que AND, OR, >, < etc...

Par exemple :

/* Select all Products that have a contributor count between 50 and 1000 and all Products with a count above 1000on a separate column */

La requête MDX se présentera de la manière suivante :

WITH MEMBER [Measures].[LargeCount] AS IIF ( [Measures].[contributors.COUNT] <= 1000 AND [Measures].[contributors.COUNT] >= 50, [Measures].[contributors.COUNT], NULL ) MEMBER [Measures].[VeryLargeCount] AS IIF ( [Measures].[contributors.COUNT] > 1000, [Measures].[contributors.COUNT], NULL ) SELECT NON EMPTY Hierarchize ( {DrillDownLevel({[Product].[ALL].[AllMember]})} ) ON ROWS, { [Measures].[contributors.COUNT], [Measures].[LargeCount], [Measures].[VeryLargeCount] } ON COLUMNS FROM [VarCube]

Filtering on measure