Principes de base des requêtes MDX

 

Aperçu

Le langage Multidimensional Expressions (MDX) permet aux utilisateurs de décrire les requêtes et de manipuler les informations multidimensionnelles, telles que les données stockées dans des cubes. Les fonctions MDX peuvent définir les membres calculés et interroger les données des cubes.

 

Comparaison entre une requête MDX et une requête SQL

Les langages MDX et SQL ont une structure semblable et certains des mots clés utilisés sont les mêmes. Toutefois, l'une des différences conceptuelles importantes entre les deux langages est que MDX élabore une vue multidimensionnelle des données, alors que SQL élabore une vue relationnelle. Bien qu'il soit possible d'utiliser SQL exclusivement pour faire des requêtes aux cubes, la requête MDX a été conçue spécifiquement pour récupérer des structures de données multidimensionnelles, avec quasiment n'importe quel nombre de dimensions. D'autre part, SQL vise à gérer uniquement des données tabulaires en deux dimensions lors du traitement des requêtes, alors que MDX peut traiter une, deux, trois dimensions ou plus dans les requêtes. Chaque dimension dans MDX est appelée un axe et les termes « colonne » et « ligne » sont simplement utilisés comme alias pour les dimensions des deux premiers axes dans la requête MDX (l'alias proprement dit n'a aucune réelle signification pour MDX).

Outre les différences conceptuelles entre MDX et SQL, les deux langages utilisent différents termes pour décrire leurs concepts fondamentaux. Par exemple, le concept du cube expliqué ci-dessus est en fait une table dans le langage SQL et le niveau du terme multidimensionnel est une colonne dans SQL (utilisant les termes « chaîne » ou « valeur discrète »). Par ailleurs, une dimension dans MDX désigne ce qu'on pourrait entendre en termes relationnels comme plusieurs colonnes liées ou une table de dimensions ; et une mesure dans MDX désigne une colonne discrète, continue ou numérique dans SQL. Enfin, un membre dans MDX désigne la ligne et colonne spécifiques d'une table de dimensions.

Pour plus de détails sur les principes de base des requêtes MDX et la comparaison entre MDX et SQL, consultez le guide de Référence des fonctions MDX (MDX for Everyone) ou les documents MDX officiels de MSDN.

 

Structure des requêtes MDX

Une requête MDX de base utilise l'instruction SELECT pour sélectionner un ensemble de données contenant un sous-ensemble de données multidimensionnelles. L'instruction SELECT est composée des clauses suivantes :

  • Clause WITH (facultative) :
    Elle permet le calcul des membres calculés ou ensembles nommés pendant le traitement des clauses SELECT et WHERE.
  • Clause SELECT :
    Elle définit les axes pour la structure des requêtes MDX en identifiant les membres de la dimension à inclure sur chaque axe. Le nombre de dimensions de l'axe d'une instruction MDX SELECT est aussi déterminé par la clause SELECT.
  • Clause FROM :
    Elle nomme le cube interrogé et détermine la source des données multidimensionnelles à utiliser pour l'extraction des données destinées à renseigner l'ensemble de résultats de l'instruction MDX SELECT. La clause FROM (dans une requête MDX) est limitée à un seul cube. Les requêtes sont limitées à une seule source de données ou cube.
  • Clause WHERE (facultative) :
    Elle détermine la dimension ou membre à utiliser comme dimension de filtrage (slicer, qui désigne habituellement l'axe formé par la clause WHERE). Cela restreint l'extraction des données à une combinaison des membres de la dimension. Une quelconque dimension qui n'apparaît pas sur un axe dans la clause SELECT peut être nommée sur le slicer.

Une requête MDX, et plus particulièrement l'instruction SELECT, peut avoir jusqu'à 128 axes spécifiés. Les cinq premiers axes ont des alias. D'autre part, un axe peut être désigné par ses données ordinales dans une requête MDX ou par son alias.

La clause SELECT peut utiliser les fonctions MDX pour construire différents membres d'un ensemble sur un axe. La clause WITH peut utiliser les fonctions MDX pour construire des membres calculés, utilisés sur un axe ou dans un slicer.

Pour l'article intégral concernant la structure des requêtes MDX, consultez le site des documents SAS.

Exemple d'utilisation MDX sur ActivePivot

L'exemple suivant vous permet de lancer une requête MDX et d'obtenir la mesure du bénéfice brut pour la marque LG et la catégorie LCD en mai 2011, avec une ventilation par numéro ASIN (Amazon Standard Identification Number). Les résultats s'affichent dans une Table Pivot grâce au serveur OLAP en temps réel d'ActivePivot d'ActiveViam.

Le serveur OLAP d'ActivePivot peut agréger les données provenant de multiples sources de données, traiter de gros volumes de données et analyser des évènements multidimensionnels, pour présenter des métriques opérationnelles et des indicateurs clés de performance (KPI), sans latence.

L'ensemble de données interrogé dans cet exemple est le projet de démonstration d'e-commerce d'ActiveViam, qui contient des données de trafic basées sur Amazon.

SELECT {[ASIN].[ASIN].Members} ON ROWS, NON EMPTY {[Category].[Category].[LCD]} ON COLUMNS FROM [Amazon] WHERE ([Measures].[Gross.Profit], [Time].[ALL].[AllMember].[2011].[5], [Brand].[Brand].[LG])

MDX Query Dataset

Au moyen de NON EMPTY, vous pouvez procéder à un filtrage des cellules :

SELECT NON EMPTY {[ASIN].[ASIN].Members} ON ROWS, NON EMPTY {[Category].[Category].[LCD]} ON COLUMNS FROM [Amazon] WHERE ([Measures].[Gross.Profit], [Time].[ALL].[AllMember].[2011].[5], [Brand].[Brand].[LG])

MDX Query - NON EMPTY

TOPCOUNT vous permet de sélectionner les n premiers éléments :

SELECT NON EMPTY TOPCOUNT({[ASIN].[ASIN].Members}, 5, ([Measures].[Gross.Profit], [Category].[Category].[LCD])) ON ROWS, NON EMPTY {[Category].[Category].[LCD]} ON COLUMNS FROM [Amazon] WHERE ([Measures].[Gross.Profit], [Time].[ALL].[AllMember].[2011].[5], [Brand].[Brand].[LG])

Ici, vous prenez les 5 premiers ASIN pour la catégorie LCD (toujours dans le contexte de LG et de mai 2011) :

MDX Query - TOPCOUNT

Enfin, vous pouvez sélectionner l'ASIN associé au bénéfice brut le plus faible, pour lequel le bénéfice brut cumulé est inférieur à 200k, avec BOTTOMSUM :

SELECT NON EMPTY BOTTOMSUM({[ASIN].[ASIN].Members}, 200000, ([Measures].[Gross.Profit], [Category].[Category].[LCD])) ON ROWS, NON EMPTY {[Category].[Category].[LCD]} ON COLUMNS FROM [Amazon] WHERE ([Measures].[Gross.Profit], [Time].[ALL].[AllMember].[2011].[5], [Brand].[Brand].[LG])

MDX Query - Displaying Top 5 ASINs