# Multidimensional Expressions

Le MDX (de l'anglais Multidimensional Expressions, « expressions multidimensionnelles ») est un langage de requête pour les bases de données OLAP, analogue au rôle de SQL pour les bases de données relationnelles. C'est aussi un langage de calcul avec une syntaxe similaire à celle des tableurs.
Le langage des expressions multidimensionnelles possède une syntaxe appropriée à l'interrogation et manipulation des données multidimensionnelles mémorisées dans un cube OLAP. Bien qu'il soit possible de traduire certaines expressions dans le langage SQL traditionnel, cela nécessite une syntaxe SQL souvent maladroite même pour des expressions MDX très simples. MDX a été adopté par une large majorité de fournisseur de la technologie OLAP et est devenu un standard de facto pour les systèmes OLAP.

## Histoire

Inventé par Mosha Pasumansky au sein de Microsoft, MDX fut présenté pour la première fois en 1997 comme un volet de la spécification OLE DB pour OLAP (ODBO). La spécification fut rapidement suivie en 1998 par une version commerciale de Microsoft OLAP Services 7.0 puis par Microsoft Analysis Services. La dernière version de la spécification ODBO a été émise par Microsoft en 1999.
Bien que ce ne soit pas un standard ouvert, mais plutôt une spécification propriétaire faite par Microsoft, elle a été adoptée par un large éventail d'éditeurs OLAP. Parmi eux, on retrouve aussi bien des éditeurs de produits serveurs tel qu'ALG Software (acquis par Business Objects), Applix, Descisys, icCube, INEA/Cartesis (acquis par Business Objects), Microstrategy, Panoratio, SAS, SAP, Whitelight, NCR, que de produits côté client comme Panorama Software, Proclarity, AppSource, Cognos, Business Objects, Brio Technology, Crystal Reports, Microsoft Excel, Microsoft Reporting Services.
À la suite de l'invention XML for Analysis qui normalise MDX en tant que langage de requête, de plus en plus d'entreprises utilisent MDX.
La spécification XMLA se réfère à la spécification ODBO pour les détails du langage MDX. Avec Analysis Services 2005, Microsoft a introduit des extensions au langage comme les sous-requêtes. Excel 2007, entre autres, commence à utiliser ces extensions MDX.
En 2001 le XMLA Council a publié la norme XML for Analysis qui inclut le langage de requête mdXML. Dans la spécification actuelle XMLA, le mdXML consiste pour l'essentiel en du MDX encapsulé dans des balises XML <expression>.

## Types de données MDX

MDX possède six types de données primaires, qui sont le scalaire, la dimension et la hiérarchie, le niveau, le tuple, le membre, et l'ensemble.

### Types primaires

Le scalaire est soit un nombre, soit une chaine de caractères. Il peut être explicitement défini, par exemple le nombre 5 ou la chaîne de caractères "OLAP". Il peut aussi être retourné par une fonction MDX, par exemple Aggregate qui retourne un nombre, UniqueName retourne une chaîne de caractères, .Value renvoie un nombre ou chaîne , etc.
La dimension est une dimension d'un cube. Les dimensions organisent les informations dans un cube, ce sont les axes d'analyse des indicateurs. MDX considère que les dimensions sont mutuellement indépendantes. Une dimension peut contenir quelques membres (voir ci-dessous) organisés en hiérarchies.
La hiérarchie d'un cube olap peut être spécifiée par son nom unique tel que [Time].[Fiscal] ou retournée par une fonction MDX comme .Hierarchy. Les hiérarchies sont contenues dans des dimensions, les spécifications MDX dans OLEDB for OLAP ne font pas la distinction entre les types de données dimension et hiérarchie. Quelques implémentations, telle que Microsoft Analysis Services les traitent différemment.
Le niveau dans une hiérarchie de dimensions peut être défini par son nom unique, par exemple [Time].[Fiscal].[Month] ou retourné par une fonction MDX : .Level.
Un membre est un membre d'une hiérarchie de dimensions. Il peut être défini par son nom unique (exemple : [Time].[Fiscal].[Month].[August 2006]), par un nom dérivé (exemple : [Temps].[Fiscal].[2006].[Q2].[August]) , ou être retourné par une fonction MDX : .PrevMember, .Parent, .FirstChild.
Un tuple est une collection ordonnée d'un ou plusieurs membres de différentes hiérarchies. Les tuples peuvent être définis explicitement comme une liste de membres, par exemple ([Time].[Fiscal].[Month].[August 2006], [Customer].[By Geography].[All Customers].[USA], [Measures].[Sales]) ou être retournés par une fonction MDX : .Item.
Un ensemble (set) est une collection ordonnée de tuples partageant les mêmes hiérarchies (dimensions). Il peut être défini explicitement comme une liste de tuples, par exemple {([Measures].[Sales], [Time].[Fiscal].[2006]), ([Measures].[Sales], [Time].[Fiscal].[2007])}, ou retourné par une fonction MDX : Crossjoin, Filter, Order, Descendants.

### Autres types de données

Dans certaines limites, MDX autorise aussi d'autres types de données. Le type tableau par exemple peut être utilisé à l'intérieur de la fonction SetToArray pour spécifier des tableaux non traités par MDX mais passés à une fonction utilisateur dans une bibliothèque ActiveX . Les dimensions peuvent être utilisées dans les fonctions Leaves. Les objets d'autres types de données sont représentés à l'aide de chaînes scalaires indiquant leurs noms, comme les noms de groupe de mesures dans la fonction MeasureGroupMeasures, ou les noms de KPI dans les fonctions KPIValue ou KPIGoal.

## Exemple de requête

L'exemple suivant, adapté de la documentation en ligne de SQL Server 2000, présente une requête MDX basique utilisant l'instruction SELECT. Cette requête renvoie un jeu de résultats comprenant les montants des ventes pour 2003 et 2002 de magasins dans l'État de Californie.
Dans cet exemple, la requête renvoie les résultats suivants :
La clause SELECT définit les axes de la requête. Ce sont le montant des ventes en magasin (Store Sales Amount) ainsi que les dates 2002 et 2003. La clause FROM indique que la requête utilise le cube "Sales" comme source de données. La clause WHERE définit le membre "California" de la dimension "Store" en tant qu'axe de transition.