This document provides an introduction to MDX (Multidimensional Expressions), which is the query language used for multidimensional databases. It explains that MDX allows for very concise queries with relatively complex results, such as year-to-date, rolling averages, and net performance. The document also discusses key MDX concepts like cubes, measures, tuples, and sets. It provides an example MDX query and demonstrates how to use functions like WITH, MEMBER, TOPCOUNT, and WHERE to retrieve specific data from an Analysis Services cube.
2. Was ist MDX
«SQL» für multidimensionale Datenbanken
Sehr kurze Abfragen mit relativ komplexen Ergebnissen
YTD
Rolling Average
Net Performance
Beispiel:
SELECT
{
([Measures].[Reseller Sales Amount]),
([Measures].[Reseller Transaction Count]),
([Measures].[Reseller Order Count])
} ON COLUMNS,
TopCount(
{[Product].[Subcategory].[Subcategory].Members},
5,
([Measures].[Reseller Sales Amount])
) +
{([Product].[Subcategory].[All Products])} ON ROWS
FROM [Step-by-Step]
;
SQL Day 2012 2
3. Ergebnis
/*
Reseller Sales Amount Reseller Transaction Count Reseller Order Count
Road Bikes $29,358,206.96 12,850 1,460
Mountain Bikes $26,492,684.38 7,487 1,215
Touring Bikes $10,451,490.22 4,463 478
Mountain Frames $4,713,672.15 4,476 860
Road Frames $3,849,853.34 4,708 1,013
All Products $80,450,596.98 60,855 3,796
Liegt immer als Pivot vor
SQL Day 2012 3
5. Der Microsoft BI Solution Stack
Data Infrastructure & BI
Platform
Analysis Services
Reporting Services
Master Data Services
Integration Services
Data Mining
Data Warehousing
6. Business Productivity
Infrastructure
Dashboards &
Scorecards
Excel Services
Web based forms &
workflow
Collaboration
Search
Content Management
LOB data integration
PowerPivot for
SharePoint
7. Delivered through a
Familiar Interface
Self-Service access &
insight
Data exploration & analysis
Predictive analysis
Data visualization
Contextual visualization
PowerPivot for Excel 2010
8. OLTP vs. Cube
OLTP
Optimiert für Write
Normalisierung
NICHT optimiert für Reporting
Cube
De-Normalisiert
Optimiert für Reporting
SQL Day 2012 8
10. Tuple
SQL
Wenn ich nichts auswähle, kommen alle Datensätze (Rows)
MDX
Wenn ich nichts auswähle, kommt das default Measure als
Summe
Die Schnittmenge von den Cube-Kanten nennt man Tuple
Der Cube ist gefüllt mit Measures (Zahlen)
SQL Day 2012 10
11. SELECT
{
([Measures].[Reseller Sales Amount]),
([Measures].[Reseller Transaction Count]),
([Measures].[Reseller Order Count])
} ON COLUMNS,
TopCount(
{[Product].[Subcategory].[Subcategory].Members},
5,
([Measures].[Reseller Sales Amount])
) +
{([Product].[Subcategory].[All Products])} ON
ROWS
FROM [Step-by-Step]
SQL Day 2012 11
12. SELECT
{
([Measures].[Reseller Sales Amount]),
([Measures].[Reseller Transaction Count]),
([Measures].[Reseller Order Count])
} ON COLUMNS,
TopCount(
{[Product].[Subcategory].[Subcategory].Members},
5,
([Measures].[Reseller Sales Amount])
) +
{([Product].[Subcategory].[All Products])} ON
ROWS
FROM [Step-by-Step]
SQL Day 2012 12
16. Variante SQL:
USE MdxStepByStep ON m.ProductKey=n.ProductKey
LEFT OUTER JOIN ( --PRODUCT SALES IN 2004
SELECT SELECT
m.EnglishProductName, o.TotalSalesAmount a.ProductKey, SUM(a.SalesAmount) AS TotalSalesAmount
FROM dbo.DimProduct m FROM (
INNER JOIN ( -- TOP 10 PRODUCTS OF 2003 SELECT
SELECT TOP 10 x.productkey, x.salesamount
a.ProductKey, SUM(a.SalesAmount) AS TotalSalesAmount FROM dbo.FactInternetSales x
FROM ( INNER JOIN dbo.DimDate y
SELECT ON x.OrderDateKey=y.DateKey
x.productkey, x.salesamount WHERE y.CalendarYear=2004
FROM dbo.FactInternetSales x UNION ALL
INNER JOIN dbo.DimDate y SELECT
ON x.OrderDateKey=y.DateKey x.productkey, x.salesamount
WHERE y.CalendarYear=2003 FROM dbo.FactResellerSales x
UNION ALL INNER JOIN dbo.DimDate y
SELECT ON x.OrderDateKey=y.DateKey
x.productkey, x.salesamount WHERE y.CalendarYear=2004
FROM dbo.FactResellerSales x ) a
INNER JOIN dbo.DimDate y GROUP BY a.ProductKey
ON x.OrderDateKey=y.DateKey ) o
WHERE y.CalendarYear=2003 ON m.ProductKey=o.productkey
) a ORDER BY n.TotalSalesAmount DESC
GROUP BY a.ProductKey
ORDER BY TotalSalesAmount DESC
) n
SQL Day 2012 16
17. Variante MDX:
WITH
MEMBER [Measures].[Total Sales Amount] AS
([Measures].[Internet Sales Amount]) + ([Measures].[Reseller Sales
Amount])
SET [Top 10 Products of 2003] AS
TOPCOUNT(
{[Product].[Product].[Product].Members},
10,
([Measures].[Total Sales Amount], [Date].[Calendar Year].[CY
2003])
)
SELECT
{([Measures].[Total Sales Amount])} ON COLUMNS,
{[Top 10 Products of 2003]} ON ROWS
FROM [Step-by-Step]
WHERE ([Date].[Calendar Year].[CY 2004])
;
SQL Day 2012 17