2013-03-06 4 views
2

J'ai récemment rencontré un problème dans notre cube SQL Server 2008 Analysis Services. Imaginez que vous avez un simple entrepôt de données de vente avec des commandes et des produits. Chaque commande peut être associée à plusieurs produits, et chaque produit peut être contenu dans plusieurs commandes. L'entrepôt de données comprend donc au moins 3 tables: une pour les produits, une pour les commandes et une pour la table de référence, modélisant la relation n: n entre les deux. La question à laquelle je veux que notre cube réponde est la suivante: Combien y a-t-il de commandes qui contiennent à la fois le produit x et le produit y? Dans SQL, cela est facile:Intersection dans MDX

select orderid from dbo.OrderRefProduct 
where ProductID = 1 
intersect 
select orderid from dbo.OrderRefProduct 
where ProductID = 3 

Depuis que je suis assez compétent dans SQL, mais un débutant dans MDX, j'ai été incapable de mettre en œuvre que dans MDX. J'ai essayé d'utiliser des mesures de comptage distinctes, les fonctions MDX intersect et nonempty et les sous-cubes. J'ai également essayé de dupliquer les dimensions logiquement (en ajoutant deux fois la dimension au cube) ainsi que physiquement (en dupliquant la table de source de données et la dimension).

Sur http://www.zeitz.net/thts/intersection.zip, vous pouvez télécharger un fichier zip de taille 25kB contenant un script SQL avec des données de test et la solution Analysis Services utilisant les tables. Nous utilisons SQL Server 2008 R2 et son équivalent Analysis Services. Les considérations de performances ne sont pas si importantes, car le volume de données est plutôt faible (millions de lignes) par rapport aux autres groupes de mesures inclus dans ce cube (milliards de lignes). L'objectif ultime serait de pouvoir utiliser les fonctionnalités souhaitées dans OLAP standard (les mesures personnalisées sont correctes), car Excel est notre interface principale, et nos clients souhaitent choisir leurs produits dans la liste des dimensions et obtenir le résultat correct dans les mesures de cube. Mais même un MDX-Query autonome fonctionnerait grandement.

Merci!

Modifier 12 mars Ai-je manqué quelque chose ou ne peut-il pas être résolu d'une manière ou d'une autre?

Si cela aide à construire le mdx, voici une autre façon d'obtenir les résultats en sql, en utilisant des sous-requêtes. Il peut être plus imbriqué. J'ai essayé quelque chose comme ça avec des sous-cubes dans mdx, mais je n'ai pas réussi à réussir.

Répondre

3

J'ai eu un aller - vous pouvez télécharger ma solution d'ici:

http://sdrv.ms/YWtMod

J'ai ajouté une copie de votre table d'information comme « référence croisée », Aliased la dimension Product1 comme une «référence croisée», définissez les références de dimension au produit indépendamment de vos relations existantes et spécifiez les relations plusieurs-à-plusieurs.

Il renvoie la bonne réponse dans Excel (exemple joint).

Vous pouvez prolonger ce motif autant de fois que nécessaire.

Bonne chance! Mike

+0

Cela fonctionne! Fantastique. Donnez-moi un jour ou deux pour bien comprendre ce que vous avez réellement fait :-D –

+0

Il y a un petit problème: j'ai réussi à étendre la solution de sorte qu'elle utilise 3 dimensions de produits (2 d'entre elles référencées, comme vous l'avez fait), ceci fonctionne parfaitement. Maintenant, quand un utilisateur (et nous avons ce type d'utilisateurs) sélectionne un produit dans les dimensions référencées product2 et product3, mais laisse le produit principal-dimnension product1 tel quel, alors le résultat est faux. Nous pourrions utiliser les calculs de cube pour forcer la sortie nulle dans ce cas, mais y a-t-il un moyen de le faire calculer correctement? Je peux fournir une solution + fichier Excel pour ce cas si nécessaire. –

+0

Dans l'onglet Utilisation des dimensions, les relations normales ne doivent exister que pour une paire de faits et de dimensions de référence croisée, c'est-à-dire que vous ne devez pas avoir plusieurs relations régulières dans la même colonne ou ligne pour les références et dimensions croisées. –

0

une autre façon de traiter cela dans SQL (je sais que cela fonctionne, mais je ne l'ai pas testé cette requête) est d'utiliser la double négation

select distinct orderid 
from X 
where TK NOT in (
    select TK 
    from X x_alias 
    where productid NOT in (id1,id2) 
) 

Je suis sûr que vous pouvez faire la même chose dans MDX.

+0

La question demande une requête MDX, pas SQL cher. – CleanBold