Add new comment

La somme des membres calculés vs le calcul des sommes

C'est le problème récurrent. Supposons-nous qu'il y a 2 mesures stockées dans notre cube : M1 et M2. Il nous faut créer un membre calculé M3 au niveau de session

CREATE MEMBER CURRENTCUBE.[Measures].[M3 = (M1 + M2) / M2] AS
([Measures].[M1] + [Measures].[M2]) / [Measures].[M2];

SSAS fait les totales comme
( Sum(M1) + Sum(M2) ) / Sum(M2)

Évidemment ce n'est pas égal à Sum(M3) = Sum( (M1 + M2) / M2 )

Comment calculer la somme des valeurs M3 au lieu d'appliquer la formule sur les sommes de mesures M1, M2 et M3 ?

En cas général vous pouvez pré-calculer le membre M3 au niveau de la source de données et puis charger les valeurs dans le cube. D'autre part, vous pouvez faire les totales dans votre outil d'interrogation du cube, i.e. Excel. C'est évident.

Mais il existe aussi un méthode basée sur la mesure stockée vide. Un peu de "hacking".

1. Créez la mesure "Null measure" au niveau de votre source de données et chargez le dans le cube. Si vous avez une vue comme la source de données de faits rajoutez la colonne

CREAT VIEW Facts
...
NULL AS [Null measure],
...

2. Dans votre script MDX créez le sous-cube basée sur votre mesure fictive, initialiser le et puis définissez dans le scope comment vous voulez calculer la somme sur les différentes niveaux.

( [Measures].[Null Measure], [Session Ids].[Id Session].[Id Session] ) =
	([Measures].[M1] + [Measures].[M2]) / [Measures].[M2];
 
CREATE [Measures].[M3 - Sum];
 
SCOPE( [Measures].[M3 - Sum] );
	[Session Ids].[Id Session].[Id Session] = [Measures].[Null Measure];
	Root( [Session Ids] ) = 
        SUM(
            [Measures].[Null Measure]
         );
END SCOPE;

3. Et voila...