web-dev-qa-db-fra.com

Cube avec 2 groupes de mesure (avec différentes relations aux dimensions) renvoie trop de membres de la dimension dans des rapports

J'ai un cube contenant des stocks des stocks des opérations de vente au détail. Il dispose de 2 groupes de mesure - un contenant le nombre d'unités de stock comptées dans chaque lot de stock-tige (qui est lié au produit, aux dimensions du produit et du temps), et un autre prix contenant des produits (qui est juste lié à la dimension du produit).

Les mesures dans le groupe de mesure des prix utilisent les opérateurs min et max (c'est-à-dire qu'ils montrent le prix minimum ou maximum sur les membres sélectionnés de la dimension des produits).

Il me semble que vous avez correctement configuré le cube et les dimensions (les mesures de prix s'affichent comme prévu) ... Sauf dans le cas suivant:

Si je demande le cube dans Excel et obtenez des unités par heure et par lot, je vois le résultat attendu (voir l'image ci-dessous, filtrée à l'heure = 2015 et cacher des lignes sans données), c'est-à-dire que les lots avec des unités de données de faits pour la sélection Membres de la dimension temporelle.

Units by Time and Batch

Si j'ajoute maintenant l'une des mesures de prix (sans changer de filtres), le total des unités est inchangé (comme prévu) mais je vois maintenant chaque membre de la dimension de lot (voir image au dessous de). Il s'agit d'un problème pour les utilisateurs finaux, car tout ce qu'ils veulent, c'est de voir les prix du produit dans les lots précédemment sélectionnés.

enter image description here

D'un point de vue technique, il a un sens de sens - les faits de prix n'ont aucune relation avec le temps, alors ne peuvent donc pas être filtrés par mon filtre de temps comme les unités.

Y a-t-il quelque chose que je puisse faire (dans la conception du cube ou Excel) pour éliminer les éléments de lot sans unités pour les filtres donnés? Remarque: i Impossible d'obtenir les utilisateurs d'écrire des requêtes MDX - Signaler le bâtiment doit rester "Point et clic"!

Edit 27/1 (Ajout d'une capture d'écran supplémentaire pour illustrer étrange effet secondaire du réglage Ignorer les dimensions non liées = Faux par réponse de Tomv)

enter image description here

4
Laurence

Comme vous l'avez dit correctement, c'est ce qui se passe lorsque vous essayez d'afficher des mesures sur une dimension auquel ils n'ont pas de relation.

Vous avez essentiellement 2 options

  1. Utilisez IgnoreUnrelatedDimensions
  2. Utilisez une solution MDX

Je vous suggère d'essayer le IgnoreUnRelatedDimensions d'abord, car les mesures seraient mieux agrégées, et NonEmptyCrossJoins serait en mesure de bénéficier de la Bitmap Indexes utilisé quand Attribute Relationships sont définis.

La solution MDX est plus un dernier recours en raison de problèmes de performance possibles et vous auriez également besoin de définir une mesure calculée pour chaque mesure que vous avez. La solution MDX serait probablement complexe ou gâcher vos totaux/montrez des données incorrectes.

IgnoreUnRelateddimensions

Lorsque vous regardez le cube AventureWorks 2012, vous avez cette situation où les employés ne sont pas liés aux "ventes Internet", mais elles sont liées aux "ventes de revendeurs".

Lors de la navigation sur le cube, le résultat est identique à celui lorsque vous ajoutez des mesures des deux groupes de mesure sur la dimension des employés.

enter image description here

Vous pouvez résoudre ce problème en définissant la propriété IgnoreUnrelatedDimensions sur False sur le Measure Group.

enter image description here

Après avoir réparé le cube et rafraîchir le navigateur, le résultat ressemble maintenant à ceci:

enter image description here

Il y a quelques mises en garde, cependant, comme un problème avec le réglage DefaultMember

Si le DefaultMember n'est pas le All level Sur l'un des attributs des dimensions non liées, vous ne recevez pas de données agrégées car l'élément par défaut agit toujours comme un filtre, même s'il n'est pas inclus dans votre tableau de pivotement:

Par exemple, après avoir défini le fichier DefaultMemberproperty sur l'attribut sexiste de la dimension des employés comme celle-ci.

enter image description here

C'est le résultat lorsqu'aucun trancheur n'est inclus dans le rapport. Bien sûr, vous voudriez voir le total ici:

enter image description here

Je semble rappeler d'autres cas de bord avec calculated measures Mais je ne me souviens pas de la situation spécifique.

solution MDX

Si vous rencontrez dans l'un des cas de bord, vous devez avoir recours à une solution MDX telle publiée par @Greggallallay, mais cela pourrait finir par être fastidieux et très spécifique à un seul rapport ou à un cas d'utilisation:

CREATE MEMBER CURRENTCUBE .[Measures].[Max Current CP With Units] AS
  IIf (
    NOT IsEmpty ( [Measures].[Units] ),
    [Measures].[Max Current CP],
    NULL
  ) ;

L'inconvénient de cette solution serait que vous découleriez la manière dont les totaux de la façon dont l'apparence et éventuellement présentent des données incorrectes, mais cela pourrait être acceptable dans votre cas spécifique d'informations de prix avec une agrégation min/max, mais une pause totalement pour les sommes et montrerait probablement fausses données à vos utilisateurs.

Par exemple lors de l'exécution de cette requête

WITH MEMBER [Measures].[Filtered internet order count] as
'
IIf (
    NOT IsEmpty ([Measures].[Reseller Order Count] ),
    [Measures].[Internet Order Count],
    NULL)
'
SELECT {[Measures].[Filtered internet order count],[Measures].[Reseller Order Count]} ON 0,
[Employee].[Employees].allmembers ON 1
FROM [Adventure Works]

Produit ce résultat

enter image description here

Ce qui semble également étrange, car le total est identique à chaque membre individuel. Mais cela peut être acceptable dans votre cas spécifique de tarification min/max, je pense que cela affiche principalement de fausses données car il n'y a pas de vente sur Internet pour ces employés.

Je suppose que si vous contrôlez les rapports, ce serait possible. Pour la table pivot ajoutée dans votre édition, je suppose que cela produirait des résultats ok.

Ajoutez cette mesure calculée au cube:

Create Member CurrentCube.[Measures].[Max Current CP With Units] as 
IIf(Not IsEmpty([Measures].[Units]),[Measures].[Max Current CP],Null);
2
GregGalloway