24 HOP edición Español - Introduccion a multidimensional expressions (mdx) en analysis services multidimensional- - Alan Koo
1. Introducción a Multidimensional
Expressions (MDX)
Libera el poder total de Analysis Services Multidimensional
Alan Koo Labrín
Senior Consultant | Nagnoi, LLC.
MVP | MCSE Business Intelligence
www.alankoo.com | @alan_koo | Facebook.com/MicrosoftBIyMas
2. Gracias a nuestros auspiciadores
Database Security as Easy as A-B-C
http://www.greensql.com
Hardcore Developer and IT
Training
http://www.pluralsight.com
SQL Server Performance
Try PlanExplorer today!
http://www.sqlsentry.com
3. Próximos SQL Saturday
6 de Diciembre de 2014
https://www.sqlsaturday.com/351/register.aspx
24 de Enero de 2015
https://www.sqlsaturday.com/346/register.aspx
18 de Abril de 2015
https://www.sqlsaturday.com/368/register.aspx
9 de Mayo de 2015
https://www.sqlsaturday.com/373/register.aspx
4. Capítulo Global PASS en Español
4
4
Reuniones semanales todos los miércoles a
las 12PM UTC-5 (Hora de Colombia)
https://www.facebook.com/SpanishPASSVC
5. 5
Asistencia Técnica
Si requiere asistencia
durante la sesión debe
usar la sección de
preguntas que esta en el
menú de la derecha.
Use el botón de Zoom
para ajustar su pantalla
al tamaño deseado
Escriba sus preguntas
en la sección de
preguntas que esta en el
menú de la derecha
6. 6
Alan Koo
Alan Koo cuenta con más de 13 años de experiencia, diseñando y
desarrollando soluciones orientadas a incrementar el desempeño de los
negocios, tanto en sector público y privado. Debido sus contribuciones y
liderazgo en la comunidad técnica, fue reconocido como Microsoft MVP en el
2014 ya por 5ta vez. Actualmente se desempeña como Consultor Sénior y líder
técnico de la Práctica de Performance Management y Business Intelligence en
Nagnoi, LLC. Co-fundador de PRPASS y actual PASS LATAM Regional Mentor,
mantiene su blog "Microsoft Business Intelligence y más..."
(http://www.alankoo.com).
6
7. 7
Agenda
Multidimensional Expressions (MDX)
Escenarios de uso
Fundamentos: ¿Dónde estamos?
Sintaxis y ejemplos
Demos, demos, demos,… y más demos!
7
8. 8
Mi experiencia
Senior Consultant en Nagnoi, LLC.
14+ años en SQL Server
9+ years en BI & OLAP
Microsoft MVP (5th year)
Miembro del equipo Microsoft BI Advisors
MCT Regional Lead – Puerto Rico
MCT Alumni BI / SQL Server / .NET
Co-Founder de Puerto Rico PASS
PASS Regional Mentor - LATAM
Blogger: www.alankoo.com
8
9. Qué es MDX (Muldimensional Expressions)
• Una base de datos multidimensional (Cubos OLAP), es un método para almacenar datos de
forma multidimensional, generalmente para propósitos de reporte.
• MDX es un lenguaje de consultas para bases de datos OLAP, análogo a SQL como lenguaje
de consulta para bases de datos relacionales.
• Use consultas MDX para obtener datos almacenados en un cubo de SQL Server Analysis
9
Services.
• Devuelve un conjunto de resultados (dataset) multidimensional que consiste de data de
celdas y data de ejes.
• Originalmente desarrollado por Microsoft (finales de los 90’s).
• Adoptado por muchos otros fabricantes de bases de datos multidimensionales.
9
10. 10
Escenarios de uso
• Herramientas de inteligencia de negocios
• Excel Pivot Tables
• Reporting Services
• PerformancePoint Services (Sharepoint)
• Power View
• Power Query
• Herramientas de terceros
• Tableau
• Business Objects
• Integración con aplicaciones Web o Windows
• ADOMD.NET
10
13. 13
Adventure Works Cube
• Dimensiones (dimensiones)
• Medidas (measures)
• Grupo de Medidas (measure groups)
• 11 Measure Groups
• 21Dimensions
13
14. 14
¿Dónde estamos?
• Dimensiones
• Date
• Product
• Customer
• Jerarquías
• Calendar (Date)
• Product Line (Product)
• Country (Customer)
14
3 niveles:
Year, Semester, Quarter
2 niveles:
All, Country
2 niveles:
All, Product Line
15. ¿Dónde estamos? Members
15
• Los items contenidos dentro de
cada jerarquía de una dimension
• Ej. Jerarquía Calendar:
15
• 2004
• H1 CY 2004
• Q1 CY 2004
• Q2 CY 2004
• Q3 CY 2004
• Q4 CY 2004
• H2 CY 2004
• Ej. Nivel Calendar Quarter:
• Q1 CY 2004
• Q2 CY 2004
• Q3 CY 2004
• Q4 CY 2004
16. 16
Identificadores
• El nombre de un objeto en Analysis Services
• Cubos, dimensiones, jerarquías (hierarchies), niveles (levels), etc.
• Por defecto:
• [Nombre de Dimensión].[Nombre de Jerarquía].[Nombre de Nivel].[Nombre de Miembro]
• Usando la llave (key) del miembro:
• [Nombre de Dimensión].[Nombre de Jerarquía].&[Llave del Miembro]
16
18. 18
¿Dónde estamos? Celdas
Un lugar en el cubo
18
Data pertinente a una intersección
de miembros
Contiene medidas
Identificada por los miembros de
una dimensión
Celda
Cantidad 1,134
X * Y * Z
Product * Quarter * Country
4 * 4 * 6 = 96 celdas
19. 19
¿Dónde estamos? Tuplas
Identifica una cela o sección
19
de un cubo
Representada por un miembro
de cada dimensión
Separados por comas,
delimitados por paréntesis
Celda
Cantidad 1,134
([Product].[Product Line].[Accesories],
[Date].[Calendar].[Calendar Quarter].&[2003].&[4],
[Customer].[Country].[Australia])
20. 20
¿Dónde estamos? Tuplas
No tiene tener que
20
explícitamente tener miembros
de todas las dimensiones
Tuple
1. ([Customer].[Country].[Australia])
2. ([Date].[Calendar].[2004].[H1 CY 2004].
[Q1 CY 2004],
[Customer].[Country].[Australia])
3. ([Date].[Calendar].[2004].[H1 CY 2004].
[Q1 CY 2004],
([Product].[Product Line].[Mountain],
[Customer].[Country].[Australia])
Tuple
Tuple
21. ¿Dónde estamos? Conjuntos (Sets)
{Customer.CCoouunnttrryy..AAuussttrraalliiaa,, [[PPrroodduucctt]]..[[PPrroodduucctt LLiinnee]]..[[MMoouunnttaaiinn]]}}
21
• Colección de tuplas
definidas usando las
misma dimensiones (en
tipo y número)
• Delimitada por llaves {}
21
{(Customer.Country.Australia), (Customer.Country.Canada)}
{
([Date].[Calendar].[2004].[H1 CY 2004]. [Q1 CY 2002],
[Product].[Product Line].[Mountain],
[Customer].[Country].[Australia]),
([Customer].[Country].[Australia],
[Date].[Calendar].[2004].[H1 CY 2004]. [Q1 CY 2003],
[Product].[Product Line].[Mountain]),
([Customer].[Country].[Australia],
[Date].[Calendar].[2004].[H1 CY 2004]. [Q1 CY 2004],
[Product].[Product Line].[Mountain])
}
{ }
23. Sintaxis básica de una consulta
• Se usa para devolver un subconjunto de la data multidimensional de un
23
servidor OLAP
[ WITH <formula_expression> [ , <formula_expression> ... ] ]
SELECT [<axis_expression>, [<axis_expression> ... ]]
FROM [<cube_expression>]
[WHERE [slicer_expression]]
• Ejes (Axis): Hasta 128 ejes, los 5 primeros tienen alias (COLUMN, ROWS,
PAGES, SECTIONS, CHAPTERS)
23
24. 24
Miembros Calculados
• Cálculos especificados por expresiones MDX
• Resuelto después de la evaluación de la expresión (en lugar de traer la data
original de las tablas de hechos)
24
WITH MEMBER [Measures].[Profit] AS
'[Measures].[Internet Sales Amount] - [Measures].[Internet Total Product Cost]'
SELECT …
WITH MEMBER Measures.[Cumulative Sales] AS
'SUM(YTD(), [Measures].[Internet Sales Amount]) '
SELECT …
25. 25
Expresiones
• Sentencias parciales de MDX que se evalúan a un valor
• Combinación de identificadores, valores y operadores que Analysis Services
puede evaluar para obtener un resultado
• Usamos las expresiones como parte de los datos a ser devueltos por una
consulta o como una condición de búsqueda de acuerdo a un criterio
25
26. Expresiones a nivel de Dimensión
Typically used when passing parameters to functions in Multidimensional
Expressions (MDX) to return members, sets, or tuples from a hierarchy.
26
26
WITH MEMBER [Measures].[MeasureCount] AS
COUNT([Measures].MEMBERS)
…
27. Expresiones a nivel de Jerarquía (dimensión)
hierarchy expression contains either a hierarchy identifier or a hierarchy
function
• WITH MEMBER [Measures].[CalendarLevelCount] AS
[Date].[Calendar].Levels.Count
SELECT [Measures].[CalendarLevelCount] ON 0
FROM [Adventure Works]
• SELECT [Measures].[Internet Sales Amount] ON 0,
27
[Date].[Calendar].MEMBERS ON 1
FROM [Adventure Works]
27
28. Expresiones a nivel de Tupla (1/2)
• Made up of one member from every dimension that is contained within a cube
• Uniquely identifies a single cell within the cube
(Member_expression [ ,Member_expression ... ] )
• Can be fully qualified, can contain implicit members, or can contain a single member
• Any dimension not explicitly referenced within a tuple is implicitly referenced
28
• Tuplas de un solo miembro
• [Measures].[TestMeasure] Miembro
• ( [Measures].[TestMeasure] ) Tupla
28
29. Expresiones a nivel de Tupla (2/2)
• Conjuntos (Sets): Lista ordenada de cero o más tuplas
• Conjuntos vacios (Empty Set): No contiene tuplas
{ [ { Tuple_expression | Member_expression } [ , { Tuple_expression | Member_expression } ] ... ] }
• SELECT {[Measures].[Internet Sales Amount], [Measures].[Internet Tax Amount]}
ON COLUMNS,
{
([Product].[Product Categories].[Category].&[4], [Date].[Calendar].[Calendar Year].&[2004]),
([Product].[Product Categories].[Category].&[1], [Date].[Calendar].[Calendar Year].&[2003]),
([Product].[Product Categories].[Category].&[3], [Date].[Calendar].[Calendar Year].&[2004])
} ON ROWS
FROM [Adventure Works]
29
29
30. Expresiones a nivel de Sub-Cubo
Puede contener un identificador de sub-cubo o una sentencia MDX que
devuelva un sub-cubo.
SELECT [Measures].MEMBERS ON COLUMNS,
[Date].[Calendar Year].MEMBERS ON ROWS
FROM (SELECT [Measures].[Internet Sales Amount] ON COLUMNS,
[Date].[Calendar Year].&[2012] ON ROWS
FROM [Adventure Works])
30
30
31. WITH MEMBER Measures.LocationName AS
[Customer].[Country].CurrentMember.Name
…
WITH MEMBER Measures.User AS USERNAME
…
31
Funciones
• Usadas para operar programáticamente sobre bases de datos
multidimensionales
31
CROSSJOIN ([Product].[Product Line].[Product Line].MEMBERS,
Customer.Country.Members) ON ROWS
…
32. Trabajando con valores Vacíos (empty)
WITH
MEMBER [Product].[Category].[All Products].ReturnZero AS 0
MEMBER MEASURES.ISEMPTYDemo AS
ISEMPTY([Measures].[Internet Tax Amount])
MEASURES.ISEMPTYDemo, MEASURES.IsZero} ON COLUMNS,
[Product].[Category].[Category].ALLMEMBERS ON ROWS
FROM [Adventure Works]
WHERE [Date].[Calendar].[Calendar Year].&[2012]
32
//Will true for any null or zero value
MEMBER MEASURES.IsZero AS
[Measures].[Internet Tax Amount]=0
SELECT {[Measures].[Internet Tax Amount],
32
33. SELECT {[Measures].[Internet Tax Amount]} ON COLUMNS,
NON EMPTY [Product].[Category].[Category].MEMBERS ON ROWS
FROM [Adventure Works]
WHERE([Date].[Calendar].[Calendar Year].&[2012])
33
NON EMPTY
33
34. WITH MEMBER MEASURES.CategoryCount AS
COUNT([Product].[Category].[Category].MEMBERS)
MEMBER MEASURES.NonEmptyCategoryCountFor2012 AS
COUNT(
NONEMPTY( [Product].[Category].[Category].MEMBERS ,
([Date].[Calendar].[Calendar Year].&[2012], [Measures].[Internet Tax Amount])
)
34
Fundamentos: NonEmpty
34
)
SELECT {MEASURES.CategoryCount, MEASURES.NonEmptyCategoryCountFor2012 }
ON COLUMNS
FROM [Adventure Works];
36. Categoría Descripción
Array functions Provide arrays for use in stored procedures
Dimension functions Return a reference to a dimension from a hierarchy, level, or member.
Hierarchy functions Return a reference to a hierarchy from a level or member.
Level functions Return a reference to a level from a member, dimension, hierarchy, or
36
Funciones (Sintaxis MDX)
36
from a string expression.
Logical functions Perform logical operations and comparisons on objects and
expressions.
Member functions Return a reference to a member from other objects or from a string
expression.
Numeric functions Perform mathematical and statistical functions on objects and
expressions.
Set functions Return a reference to a set from other objects or from a string
expression.
String functions Return string values from other objects or from the server.
Tuple functions Return a reference to a tuple from a set or from a string expression.
37. Funciones de Cadena (String)
[Product].[Product].CurrentMember.Name
MEMBER [Measures].[ProductUniqueName] AS
[Product].[Product].CurrentMember.Uniquename
MEMBER [Measures].[ProductDimensionName] AS
SELECT {[Measures].[ProductName], [Measures].[ProductUniqueName],
[Measures].[ProductDimensionName]} ON COLUMNS,
[Product].[Product].MEMBERS ON ROWS
37
WITH
MEMBER [Measures].[ProductName] AS
[Product].Name
FROM [Adventure Works] ;
37
38. Funciones de Cadena (String)
SELECT {STRTOMEMBER("[Measures].[Inter" + "net Sales Amount]")} ON COLUMNS,
STRTOSET("{
[Product].[Product Categories].[Category].&[3],
[Product].[Product Categories].[Product].&[477],
[Product].[Product Categories].[Product].&[788],
[Product].[Product Categories].[Product].&[708],
[Product].[Product Categories].[Product].&[711]
}") ON ROWS
38
FROM [Adventure Works];
38
39. IsLeaf([Date].[Calendar].CurrentMember)
MEMBER MEASURES.[IsAncestorDemo] AS
IsAncestor([Date].[Calendar].CurrentMember,
[Date].[Calendar].[Date].&[1])
SELECT {MEASURES.[IsLeafDemo], MEASURES.[IsAncestorDemo] } ON 0,
[Date].[Calendar].MEMBERS ON 1
39
Funciones Lógicas
WITH
MEMBER MEASURES.[IsLeafDemo] AS
FROM [Adventure Works];
39
40. Funciones a nivel de Miembro
[Date].[Calendar].CurrentMember.Parent.Name
ANCESTOR([Date].[Calendar].CurrentMember, [Date].[Calendar].[Calendar Year]).Name
[Date].[Calendar].CurrentMember.Prevmember.Name
SELECT {MEASURES.[CurrentMemberDemo], MEASURES.[ParentDemo],
MEASURES.[AncestorDemo], MEASURES.[PrevMemberDemo] } ON 0,
40
WITH
MEMBER MEASURES.[CurrentMemberDemo] AS
[Date].[Calendar].CurrentMember.Name
MEMBER MEASURES.[ParentDemo] AS
MEMBER MEASURES.[AncestorDemo] AS
MEMBER MEASURES.[PrevMemberDemo] AS
[Date].[Calendar].MEMBERS ON 1
FROM [Adventure Works];
40
41. Funciones a nivel de Miembro: ParallelPeriod
41
41
january
february
march
april
may
june
july
august
september
october
november
december
Quarter 1
Quarter 2
Quarter 3
Quarter 4
Semester 1
Semester 2
ParallelPeriod([Quarter, 1, April])
ParallelPeriod([Quarter, -2, April])
42. Funciones a nivel de Conjunto (Set): Descendants
SELECT [Measures].[Internet Sales Amount] ON Columns,
DESCENDANTS( [Date].[Calendar].[Calendar Year].&[2011] ,
[Date].[Calendar].[Date]) ON Rows
42
FROM [Adventure Works];
42
43. Funciones a nivel de Conjunto (Set): Order
SELECT [Measures].[Internet Sales Amount] ON Columns,
ORDER(
DESCENDANTS( [Date].[Calendar].[Calendar Year].&[2012]
43
43
,
[Date].[Calendar].[Date]) ,
[Measures].[Internet Sales Amount], BDESC
) ON ROWS
FROM [Adventure Works] ;
44. Funciones a nivel de Conjunto (Set): Filter
SELECT [Measures].[Internet Sales Amount] ON Columns,
44
44
FILTER(
DESCENDANTS( [Date].[Calendar].[Calendar Year].&[2010] ,
[Date].[Calendar].[Date])
, [Measures].[Internet Sales Amount]>10000
) ON Rows
FROM [Adventure Works]