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.
Cela fonctionne! Fantastique. Donnez-moi un jour ou deux pour bien comprendre ce que vous avez réellement fait :-D –
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. –
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. –