Multidimensional Expressions

**Multidimensional Expressions** (**MDX**) er et spørrespråk for online analytisk prosessering (OLAP) ved bruk av et databasehåndteringssystem. I likhet med SQL er det et spørrespråk for OLAP-kuber. Det er også et beregningsspråk med syntaks som ligner på regnearkformler.

## Bakgrunn
MDX-språket tilbyr en spesialisert syntaks for spørring og manipulering av flerdimensjonale data som er lagret i OLAP-kuber. Selv om det er mulig å oversette noen av disse spørringene til tradisjonell SQL vil det ofte kreve en syntese av klønete SQL-uttrykk for det som ellers kan gjøres med veldig enkle MDX-uttrykk. MDX har blitt omfavnet av et stort flertall av OLAP-leverandører, og har blitt en bransjestandard for OLAP-systemer.

## Historie
MDX ble først introdusert i 1997 som en del av den Microsoft-publiserte spesifikasjonen og bransjestandarden OLE DB for OLAP. Det ble skapt av en gruppe utviklere fra SQL Server inkludert Mosha Pasumansky . Spesifikasjonen ble raskt etterfulgt i 1998 av den kommersielle utgivelsen av Microsoft OLAP Services 7.0, og senere av Microsoft Analysis Services (SSAS). Den siste versjonen av OLE DB for OLAP-spesifikasjonen ble utgitt av Microsoft i 1999. 

Selv om det ikke var en åpen standard, men snarere en Microsoft-eid spesifikasjon, ble den tatt i bruk av et bredt spekter av OLAP-leverandører.

XML for Analysis-spesifikasjonen refererte tilbake til OLE DB for OLAP-spesifikasjonen for detaljer om MDX Query Language. I Analysis Services 2005 la Microsoft til noen utvidelser for MDX Query Language som delspørring. Produkter som Microsoft Excel 2007 begynte å bruke disse nye MDX Query Language-utvidelsene. Noen refererer til denne nyere varianten av MDX som MDX 2005.

### mdXML
I 2001 ga XMLA Council ut standarden XML for Analysis (XMLA) som inkluderte mdXML som spørrespråk. I XMLA 1.1-spesifikasjonen er mdXML hovedsakelig MDX pakket inn i XML `<Statement>`-taggen.

## MDX-datatyper
Det er seks primære datatyper i MDX:

* **Skalar** (*scalar*): En skalar er enten et tall eller en streng Den kan spesifiseres som en direkteverdi (*literal*), for eksempel tallet 5 eller strengen "OLAP", eller den kan returneres av en MDX-funksjon, for eksempel `Aggregate` (tall), `UniqueName` (streng), `.``Value` (tall eller streng), og så videre.
* **Dimensjon og hierarki** (*dimension and hierarchy*): En dimensjon er en dimensjon av en kube, og dimensjonen er den primære organisatoren av mål og attributtinformasjon i en kube. MDX kjenner ikke til (og antar heller ikke) noen avhengigheter mellom dimensjoner: De antas å være gjensidig uavhengige. En dimensjon vil inneholde noen medlemmer (se nedenfor) organisert i et hierarki eller hierarkier som inneholder nivåer. Det kan spesifiseres med sitt unike navn, som for eksempel `[Time]` eller kan returneres av en MDX-funksjon, for eksempel `.Dimension`. Hierarkier er dimensjons- av en kube. De kan spesifiseres ved sitt unike navn, for eksempel `[Time].``[Fiscal]` eller kan returneres av en MDX-funksjon, for eksempel `.Hierarchy`. Hierarkier er inneholdt i dimensjoner. OLEDB for OLAP MDX-spesifikasjonen skiller ikke mellom dimensjons- og hierarkidatatyper. Noen implementeringer, for eksempel Microsoft Analysis Services, behandler dem annerledes.
* **Nivå** (*level*): Nivå er et nivå i et dimensjonshierarki. Det kan spesifiseres med sitt unike navn, for eksempel `[Time].``[Fiscal].[Month]` eller kan returneres av en MDX-funksjon, for eksempel `.Level`.
* **Medlem** (*member*): Medlem er et medlem i et dimensjonshierarki. Det kan spesifiseres med sitt unike navn, for eksempel  `[Time].``[Fiscal].[Month].[August 2006]`, med kvalifisert navn, for eksempel `[Time].``[Fiscal].[2006].[Q3].[August 2006]` eller returnered av en MDX-funksjon, for eksempel `.PrevMember`, `.``Parent`, `.``FirstChild`, og så videre. Merk at alle medlemmer er spesifikke for et hierarki. Dersom det samme produktet er medlem av to forskjellige hierarkier (`[Product].``[ByManufacturer]` and `[Product].``[ByCategory]`) vil det være to forskjellige medlemmer som kanskje må koordineres i mengder og tupler (se under).
* **Tuppel** (*tuple*): En tuppel er en ordnet samling av ett eller flere medlemmer fra forskjellige dimensjoner. Tupler kan spesifiseres ved å oppregne (*enumerate*) medlemmene, for eksempel `([Time].``[Fiscal].[Month].[August], [Customer].[By Geography].[All Customers].[Norway], [Measures].[Sales])` eller returnert av en MDX-funksjon, for eksempel `.``Item`.
* **Mengde** (*set*): En mengde er en ordnet samling av tupler med samme dimensjonalitet, eller hierarkitet i tilfelle Microsoft sin implementering. Den kan spesifiseres ved å oppregne (*enumerate*) tuplene, for eksempel .`{([Measures].``[Sales], [Time].[Fiscal].[2006]), ([Measures].[Sales], [Time].[Fiscal].[2007])}` eller returneres fra en MDX-funksjon eller -operator, for eksempel `Crossjoin`, `Filter`, `Order`, `Descendants`, og så videre.
* **Andre datatyper**: Medlemsegenskaper tilsvarer attributter i datavarehus. De kan hentes etter navn i en spørring ved hjelp av en akses properties-klausul. Den skalare dataverdien til en medlemsegenskap for et gitt medlem kan aksesseres i et MDX-uttrykk enten ved å navngi egenskapen (for eksempel `[Product].``CurrentMember.[Sales Price]`) eller ved å bruke en spesiell aksessfunksjon (for eksempel `[Product].CurrentMember.``Properties("Sales Price")`). I enkelte sammenhenger tillater MDX også andre datatyper, for eksempel kan array brukes i `SetToArray`-funksjonen for å spesifisere et array som ikke behandles av MDX, men som sendes til en brukerdefinert funksjon i et ActiveX-bibliotek. Objekter av andre datatyper representeres som skalare strenger som indikerer objektnavnene, slik som gruppenavn på målinger i Microsofts `MeasureGroupMeasures`-funksjon eller KPI-navn i for eksempel Microsofts `KPIValue`- eller `KPIGoal`-funksjoner.

## Eksempel på spørring
Følgende eksempel tilpasset fra SQL Server 2000 Books Online viser en enkel MDX-spørring med et select-uttrykk. Den returnerer en resultatmengde som inneholder salgsbeløpene for 2002 og 2003 for butikker i Nordland fylke.


```tsql
SELECT
  [Measures].[Store Sales] ON COLUMNS,
  [Date].Members ON ROWS
FROM Sales
WHERE ( [Store].[Norway].[Nordland] )
```


I dette eksemplet definerer spørringen følgende resultatmengde:
* Select-klausulen setter spørreaksene til Store Sales-medlemmet i Measures-dimensjonen, og 2002- og 2003-medlemmene i Date-dimensjonen
* From-klausulen indikerer at datakilden er Sales-kuben
* Where-klausulen definerer skiveindelings-aksen (*slicer axis*) som Nordland-medlemmet i Store-dimensjonen

Det kan spesifiseres opptil 128 spørringsakser i en MDX-spørring.

Hvis det opprettes to akser må en av dem være kolonneaksen og den andre må være radaksen, selv om det ikke spiller noen rolle hvilken rekkefølge de vises i spørringen. Dersom det opprettes en spørring som bare har én akse må det være kolonneaksen. Firkantparentesene rundt objektidentifikatorne er valgfrie så lenge objektidentifikatoren ikke er et reservert ord og ellers ikke inneholder andre tegn enn engelske bokstaver, tall eller understreker.


```tsql
SELECT
    [Measures].[Store Sales] ON COLUMNS,
    [Date].Members ON ROWS
FROM Sales
WHERE ( [Store].[Norway].[Nordland] )
```


## Referanser