2009-11-20 22 views
5

Dire que j'ai une mesure, foo, dans un cube, et j'ai une obligation de déclaration que les utilisateurs veulent voir les mesures suivantes dans un rapport:Filtrage d'une mesure (ou suppression Outliers)

total foo 
total foo excluding instances where foo > 10 
total foo excluding instances where foo > 30 

Qu'est-ce la meilleure façon de gérer cela? Dans le passé, j'ai ajouté des calculs nommés qui renvoient NULL si foo > 10 ou juste foo sinon. Je me sens comme il doit y avoir un moyen d'y arriver dans MDX (quelque chose comme Filter([Measures].[foo], [Measures].[foo] > 10)), mais je ne peux pas pour la vie de me quoi que ce soit.

Toutes les idées?

Répondre

3

L'astuce est que vous Par exemple, en utilisant le cube de démonstration habituel Microsoft 'entrepôt et ventes', le MDX suivant affichera les ventes pour tous les magasins dont les ventes étaient supérieures à 2000 $.

 
SELECT Filter([Store].[Stores].[Store].members, [Unit Sales] > 2000) ON COLUMNS, 
[Unit Sales] ON ROWS 
FROM [Warehouse and Sales] 
+1

Je vous remercie de votre entrée, ce n'est pas du tout l'e désiré Je vais pour. Votre exemple filtre un ensemble de magasins, mais ce que je recherche est un moyen de filtrer les enregistrements de faits. En utilisant votre exemple, disons que je voulais montrer les ventes unitaires moyennes par magasin, je veux toujours montrer chaque magasin, mais je ne veux pas que la moyenne globale des ventes unitaires> 2000. – Colin

2

je pense que vous avez deux choix:

1- Ajouter une colonne à votre fait (ou vue sur la vue de source de données basée sur la table de fait) comme:

case when unit_Price>2000 then 1 
    else 0 
end as Unit_Price_Uper_Or_Under_10 

et d'ajouter une dimension fictive basée sur cette valeur des colonnes. et ajoutez la requête nommée pour New Dimension (dire Range_Dimension dans DataSourceView: sélectionner 1 plage union tous sélectionnez 0 comme gamme

et après taht vous cant utilisé ce filtre comme autre dimension et l'attribut

SELECT [Store].[Stores].[Store].members ON COLUMNS, 
[Unit Sales] ON ROWS 
FROM [Warehouse and Sales] 
WHERE [Test_Dimension].[Range].&[1] 
.

le problème est pour chaque plage que vous devez ajouter When état et seulement si la plage est statique cette solution est une bonne solution. et dynamique, il est préférable de formuler la gamme (selon la méthode disceretizing)

2- ajouter une dimension avec une granularité près de la table de fait sur la table de fait par exemple, si nous avons table fait avec Sale_id clé primaire .nous peut ajouter dimension basée sur la table de fait avec une seule colonne sale_Id et dimension Usage tab nous pouvons relier cette new dimension et measure group avec le type de relation Fact et après que mdx nous pouvons utiliser quelque chose comme:

filter([dim Sale].[Sale Id].[Sale Id].members,[Measures].[Unit Price]>2000) 
0

j'ai rencontré le même problème lorsque l'utilisation Saiku (back-end avec Mondrain), comme je l'ai pas trouvé de solution claire " ajouter un filtre sur mesure ", je l'ai ajouté ici, et Cela peut être utile pour un autre gars. En Saiku3.8, vous pouvez ajouter un filtre sur l'interface utilisateur: "column" -> "filter" -> "custom", alors vous pouvez voir une expression Filter MDX.

Supposons que nous voulons clics dans Ad supérieur à 1000, puis ajoutez la ligne suivante il:

[Measures].[clicks] > 1000 

Enregistrer et fermer, alors que le filtre sera valable pour trouver élém avec des clics supérieurs à 1000.

le MDX aime ci-dessous (supposons dt dimension et de clics mesure, nous voulons trouver dt avec des clics plus de 1000)

WITH 
SET [~ROWS] AS 
    Filter({[Dt].[dt].[dt].Members}, ([Measures].[clicks] > 1000)) 
SELECT 
NON EMPTY {[Measures].[clicks]} ON COLUMNS, 
NON EMPTY [~ROWS] ON ROWS 
FROM [OfflineData]