1 MULTIDIMENTIONAL EXPRESSIONS Introdução 2 Microsoft, década de 90. Criação de relatórios Business Intelligence --> gestão de negócio 1
Introdução 3 MDX x SQL MDX surgiu através de SQL 4 Sintaxe: <mdx_expression> ON COLUMNS //0 <mdx_expression> ON ROWS //1 <mdx_expression> ON PAGES //2 FROM <nome_cubo> WHERE <slicer_expression> 2
MDX x SQL 5 Ambas possuem funções para cálculos. Diferentes fontes de consulta. MDX não defini dados. MDX navega em hierarquia. Cubo [Dimensões] + Dimensão [Membros] + [Hieraquia] Hierarquia [Nível] + Nível [Membros] + Membros [Filhos] + Conceitos necessários 6 3
Navegar no cubo: Dimensao.<Sintaxe Member> <Sintaxe Member> = Membro.[nome do filho função] Navegar em uma hierarquia Dimensao.HIERARQUIA. [ Nivel. <Sintaxe Member> <Sintaxe Member> ] Cuidado com abreviações Ano 2010 e 2011 Tempo.[Hierarquia Tempo].Ano.Semestre.1 Semestre 1 de qual ano? Conceitos necessários 7 Colchetes - [ ] - Espaços em branco Números Caracteres Selecionar um única célula Relacionar membros de todas as dimensões 8 ( ) [Produto]. [Milho], Tempo. Maio, [Loja]. [Recife] 4
Selecionar um conjunto Realacionar um ou mais membros da mesma dimensão membros de outras. ( ) 9 { ( [Tempo]. [Abril], [Loja]. [Recife], [Produto]. [Milho] ), ( [Tempo]. [Maio], [Loja] [Loja]. [Recife],. [Recife], [Produto] [Produto]. [Milho]. [Milho] ), ( [Tempo]. [Junho], [Loja]. [Recife], [Produto]. [Milho] ), ( [Tempo]. [Julho], [Loja]. [Recife], [Produto]. [Milho] ) } 10 5
11 12 6
Função Children Função Children Retorna o conjunto dos filhos de um membro especificado. Caso o membro não possua uma hierarquia, um conjunto vazio será retornado. Sintaxe: [Dim].[Membro].Children Exemplo: Qual o valor arrecado nos dois primeiros trimestres do ano de 2006? 13 Função Children 14 [Year - Half Year - Quarter - Month - Date]. [Half Year]. [Semester 1, 2006].CHILDREN ON COLUMNS, [Measures].[Valor] ON ROWS FROM POINTFILMES 7
Função FirstChild Função FirstChild 15 Retorna o primeiro membro filho de um membro especificado. Sintaxe: [Dim].[Membro].FirstChild Exemplo: Qual o valor arrecadado somente no primeiro trimestre do ano de 2006? Função FirstChild 16 [Year - Half Year - Quarter - Month - Date]. [Half Year]. [Semester 1, 2006]. FIRSTCHILD ON COLUMNS FROM POINTFILMES 8
LastChild Função LastChild 17 Retorna o último membro filho de um membro especificado. Sintaxe: [Dim].[Membro].LastChild Exemplo: qual o valor arrecado no segundo semestre de 2006? Função LastChild 18 [Year - Half Year - Quarter - Month - Date]. [Calendar 2006].LASTCHILD ON COLUMNS FROM POINTFILMES 9
Função Parent Função Parent 19 Retorna o membro pai de um membro especificado. O pai do membro especificado é o mesmo pai do nível ao qual o membro pertence. Sintaxe: [Dim].[Membro].Parent Exemplo: qual o valor arrecado no segundo semestre de 2006? Obs.: Consulta igual a da função. Mostrando que é possível conseguir um mesmo resultado com diferentes formas de navegar na hierarquia. Função Parent 20 [Year - Half Year - Quarter - Month - Date]. [Quarter]. [Quarter 3, 2006].PARENT ON COLUMNS FROM POINTFILMES 10
Função Descendants Função Descendants 21 Retorna um conjunto de descendentes de um membro em um determinado nível. Os argumentos necessários são: um nível de uma hierarquia, e o membro do qual se deseja obter os descendentes. Sintaxe: Descendants( membro, nível ) Exemplo 1: qual o valor que cada funcionário arrecadou com as locações em cada trimestre de 2006? Função Descendants 1 22 [DIM FUNCIONARIO].[Nome].children ON 1, DESCENDANTS ( [Year - Half Year - Quarter - Month - Date].[Year].[Calendar 2006], [Year - Half Year - Quarter - Month - Date]. [Quarter] )ON 0 FROM [POINTFILMES] 11
Função Descendants 2 23 Exemplo 2: qual a quantidade de locações que cada funcionário realizou, em cada trimestre do ano 2006? [DIM FUNCIONARIO].[Nome].children ON Rows, DESCENDANTS ( [Year - Half Year - Quarter - Month - Date].[Year].[Calendar 2006], [Year - Half Year - Quarter - Month - Date].[Quarter] )ON Columns FROM [POINTFILMES] WHERE [Measures].[FATOS Count] Função Descendants (Variações) 24 Variações ( 1 ): com mesmo retorno do exemplo 2. Sintaxe: Descendants( membro, número ) [DIM FUNCIONARIO].[Nome].children ON 1, DESCENDANTS ( [Year - Half Year - Quarter - Month - Date]. [Year]. [Calendar 2006], 2 ) ON 0 FROM [POINTFILMES] WHERE [Measures].[FATOS Count] 12
Variações ( 2 ): Função Descendants (Variações) 25 retorna o próprio membro e seus descendentes. Sintaxe: Descendants( [nível membro] ) [DIM FUNCIONARIO].[Nome].children ON 1, DESCENDANTS ( [Year - Half Year - Quarter - Month - Date]. [January 2006] )ON 0 FROM [POINTFILMES] WHERE [Measures].[FATOS Count] Função CurrentMember 26 Função CurrentMember Em cada passo de uma iteração recuperamos o membro que está sendo utilizado através da função CurrentMember. Sintaxe: Hierarchy_Expression.CurrentMember Exemplo apresentado no próximo item (Criar Membro Calculado) 13
Membro Calculado Reuso de código Simplificar consultas (*) Membro Calculado 27 Sintaxe: WITH <Select With Clause> consulta_mdx <Select With Clause> ::= [ MEMBER identifier AS mdx_expression SET identifier AS set_expression ] + Membro Calculado 28 Exemplo: qual o valor percentual arrecadado em cada mês, em relação ao seu trimestre? WITH MEMBER Measures.ValorPercentual AS ( [Year - Half Year - Quarter - Month - Date].CURRENTMEMBER, [Measures].[Valor] ) / ( [Year - Half Year - Quarter -Month-Date].CURRENTMEMBER.Parent, [Measures].[Valor] ) * 100 14
Membro Calculado 29 Measures.ValorPercentual ON COLUMNS, Descendants ( [Year - Half Year - Quarter - Month - Date], [Year - Half Year - Quarter - Month - Date]. [Month] ) ON ROWS FROM POINTFILMES PrevMember e NextMember 30 Função PrevMember e Next Member PrevMember retorna o membro anterior ao membro especificado, no mesmo nível. NextMember retorna o próximo membro do membro especificado, no mesmo nível. Sintaxe: [Dim].[Membro].PrevMember/NextMember 15
Exemplos: PrevMember e NextMember 31 [Year - Half Year - Quarter - Month - Date]. [Month]. [January 2007].NEXTMEMBER ON COLUMNS FROM POINTFILMES //Retorno: valor arrecado em Feveiro 2007 [Year - Half Year - Quarter - Month - Date]. [Month].[January 2007].PREVMEMBER ON COLUMNS FROM POINTFILMES //Retorno: valor arrecado em Dezembro 2006 Função Lag Função Lag 32 Recebe um número n positivo como parâmetro e retorna o n- ésimo membro anterior ao membro onde foi aplicada a função. Sintaxe: [Dim].[Membro].Lag(n) n=0, o retorna o próprio membro. n =1, o retorno é igual ao da função PrevMember aplicado ao mesmo membro. n=-1, o retorno é igual ao da função NextMember aplicado ao mesmo membro. 16
Exemplos: Função Lag 33 [Year - Half Year - Quarter - Month - Date].[Month].[January 2007]. LAG(0) ON COLUMNS FROM POINTFILMES //Retorno: valor arrecado em Janeiro 2007 [Year - Half Year - Quarter - Month - Date].[Month].[January 2007]. LAG(1) ON COLUMNS FROM POINTFILMES //Retorno: valor arrecado em Dezembro 2007 Função Lag 34 Exemplos (continuação): [Year - Half Year - Quarter - Month - Date]. [Month]. [January 2007]. LAG(-1) ON COLUMNS FROM POINTFILMES //Retorno: valor arrecado em Feveiro 2007 17
Função Lead Função Lead 35 A definição é similar a definição da função Lag, porém o n- ésimo termo positivo retornado é posterior. Sintaxe: [Dim].[Membro].Lead(n) n=0, o retorno é o próprio membro. n =1, o retorno é igual ao da função NextMember aplicado ao mesmo membro. n=-1, o retorno é igual ao da função PrevMember aplicado ao mesmo membro. Exemplos: Função Lead 36 [Year - Half Year - Quarter - Month - Date].[Month].[January 2007]. LEAD(0) ON COLUMNS FROM POINTFILMES //Retorno: valor arrecado em Janeiro 2007 [Year - Half Year - Quarter - Month - Date].[Month].[January 2007]. LEAD(1) ON COLUMNS FROM POINTFILMES //Retorno: valor arrecado em Feveiro 2007 18
Função Lead 37 [Year - Half Year - Quarter - Month - Date].[Month].[January 2007]. LEAD(-1) ON COLUMNS FROM POINTFILMES //Retorno: valor arrecado em Dezembro 2007 Lembrando a função Lag(n) retorna elementos anteriores a função Lead(n) retorna elementos posteriores Função Avg Função AVG 38 Retorna o valor médio de uma expressão numérica avaliada em um conjunto. Sintaxe: Avg ( {conjunto}, expressão numérica). Exemplos: qual a média de locação de cada filme por mês. 19
Função AVG 39 WITH MEMBER Measures.ValorMedio AS AVG ( DESCENDANTS ( [Year - Half Year - Quarter - Month - Date], [Year - Half Year - Quarter - Month - Date]. [Month] ), [Measures].[FATOS Count] ) Measures.ValorMedio ON COLUMNS, [DIM FILME].[Nome].CHILDREN ON ROWS FROM POINTFILMES Função Members Função Members 40 Retorna o conjunto de membros em uma dimensão, nível ou hierarquia. Sintaxe: [Dim].Members [Hierarquia].Members [Nivel].Members Exemplo: o exemplo da função Members será apresentado junto com a função Order, logo abaixo. 20
Função Order Função Order 41 Organiza os membros de um conjunto especificado, preservando ou não a ordem hierárquica. Sintaxe: Order({conjunto}, expressão aritmética [,ASC DESC BASC BDESC ] ) ASC: conjunto na ordem ascendente de acordo com a hierarquia; DESC: conjunto na ordem descendente de acordo com a hierarquia; BASC: conjunto na ordem ascendente quebrando a hierarquia; BDESC: conjunto na ordem descendente quebrando a hierarquia; A letra B de BASC e BDESC vem de Break, com significado de quebrar a hierarquia. Função Order 42 Exemplo: ordenar os filmes por valor total arrecadado no ano de 2007. ORDER ([DIM FILME].[Nome].MEMBERS, [Measures].[Valor],DESC ) ON COLUMNS FROM POINTFILMES WHERE [Month].[December 2007] 21
Função SUM Função SUM 43 Retorna soma de conjunto de valores. Sintaxe: SUM ( {conjunto valores}). Exemplos: Exemplo apresentado na descrição do operador Range. Operador Range (:) Função RANGE ( : ) 44 Esse operador retorna um conjunto de membros ordenados que estão entre dois membros especificados. Os dois membros são inclusos no conjunto resultado. Sintaxe: Membro1 : Membro2 Exemplos: Neste exemplo apresentamos os filmes em ordem decrescente do valor total de locações que cada um gerou. 22
Função RANGE ( : ) 45 WITH MEMBER Measures.RENDA_NAS_FERIAS AS SUM ( { [Year - Half Year - Quarter - Month - Date]. [December 2006] : [Year - Half Year - Quarter - Month - Date]. [February 2007] }, [Measures].[Valor] ) Função RANGE ( : ) 46 ORDER ( [DIM FILME].[Nome].CHILDREN, (Measures.RENDA_NAS_FERIAS) ) ON COLUMNS FROM POINTFILMES 23
Operador CrossJoin Função CrossJoin 47 Retorna um conjunto que é o produto cartesiano entre dois conjuntos. Esse produto uma relação vazia, ou seja, quando os elementos não se relacionam. Sintaxe: CrossJoin({conjunto1},{conjunto2} [,conjunton]* ) Exemplo: quais filmes cada cliente alugou e quais ele não alugou? Função CrossJoin 48 CROSSJOIN ( [DIM CLIENTE].[Nome].CHILDREN, [DIM FILME].[Nome].CHILDREN ) ON COLUMNS FROM POINTFILMES WHERE MEASURES.[FATOS COUNT] 24
Funçao NonEmpty Função NonEmpty 49 Semelhante a função CrossJoin, porém o conjunto resultante do produto cartesiano somente possui elementos que são do primeiro conjunto e que se relacionam com algum do segundo. Sintaxe: NonEmpty({conjunto1},{conjunto2}) Exemplo: quantos filmes cada cliente alugou? Função NonEmpty 50 NONEMPTY ( [DIM CLIENTE].[Nome].CHILDREN, [DIM FILME].[Nome].CHILDREN ) ON COLUMNS FROM POINTFILMES WHERE MEASURES.[FATOS COUNT] 25
Função NonEmptyCrossJoin 51 Função NonEmptyCrossJoin Retorna um conjunto que é o produto cartesiano de outros conjuntos, com exceção de tuplas vazias, ou seja, é a união das duas funções anteriores, Crossjoin com NonEmpty. Sintaxe: NonEmptyCrossJoin ({conjunto1},{conjunto2} [,conjunton]*) Função NonEmptyCrossJoin 52 Exemplo: Quais os funcionários que realizaram a locação de pelo menos um filme no dia 01/01/2006? Quais foram os filmes e quanto foi o aluguel de cada um? 26
Função NonEmptyCrossJoin 53 NONEMPTYCROSSJOIN ( [Year - Half Year - Quarter - Month - Date]. [Year].[Calendar 2006].[Semester 1, 2006]. [Quarter 1, 2006]. [January 2006].[Sunday, January 01 2006], [DIM FUNCIONARIO].[Nome].CHILDREN, [DIM FILME].[NOME].CHILDREN )ON 1 { [Measures].[FATOS Count], [Measures].[Valor] } on 0 FROM [POINTFILMES] Função TopCount Função TopCount 54 Retorna um conjunto com os n elementos que possuem os maiores valores computado por alguma expressão no conjunto passado. Sintaxe: TopCount({conjunto}, n, expressao) Exemplo: quais os 10 clientes que mais alugaram e qual foi a quantidade? 27
Função TopCount 55 [Measures].[FATOS Count] ON COLUMNS, TOPCOUNT ( [DIM CLIENTE].[Nome].children, 10, [Measures].[FATOS Count] )ON ROWS FROM [PointFilmes] Função Rank Função Rank 56 Retorna uma classificação/posição (1, 2, 3, 4...) de um membro com base na sua classificação em um determinado conjunto. Sintaxe: Rank( membro, {conjunto} ) Exemplos: o exemplo da função Rank será apresentado no próximo tópico (conjunto nomeado) 28
Conjunto Nomeado Reuso de código Simplificar consultas (*) Escopo da consulta (o que utilizaremos), Escopo da sessão Escopo global. Conjunto Nomeado 57 Conjunto Nomeado 58 Sintaxe: WITH <Select With Clause> consulta_mdx <Select With Clause> ::= [ MEMBER identifier AS mdx_expression SET identifier AS set_expression ] + 29
Conjunto Nomeado 59 Exemplos: criar um rank dos clientes que mais alugaram filmes. Apresentar os clientes, a posição de cada um no rank e quantidade de filmes locados. Obs: O resultado é similar ao exemplo apresentado no função TopCount. Conjunto Nomeado 60 WITH SET [OrderedSet] AS ORDER ( [DIM CLIENTE].[Nome].[Nome].MEMBERS, [Measures].[FATOS Count], BDESC ) MEMBER [Measures].[Rank] AS RANK ( [DIM CLIENTE].[Nome].CurrentMember, [OrderedSet] ) 30
Conjunto Nomeado 61 { [Measures].[Rank], [Measures].[FATOS Count] } ON 0, [OrderedSet] ON 1 FROM [PointFilmes] Função DrillDownLevel 62 Função DrillDownLevel Acessa um cojunto em um determinado nível Sintaxe: DrillDownLevel ({conjunto} [, nível número]) 31
Função DrillDownLevel 1 63 Se nem expressão de nível ou o número for especificado (DrillDownLevel ({conjunto})), então a função irá retornar um conjunto composto pelo nível especificado e seus filhos. Exemplo 1: qual o valor arrecadado no primeiro semestre de 2009 e nos seus respectivos trimestres? Função DrillDownLevel 1 64 DRILLDOWNLEVEL ( [Year - Half Year - Quarter - Month - Date]. [Year]. [Calendar 2009]. [semester 1, 2009] ) ON 0 FROM POINTFILMES 32
Função DrillDownLevel 2 65 Se uma expressão de nível for especificada (DrillDownLevel ({conjunto}, nível) e não existir nenhum membro no nível especificado, no conjunto, esse conjunto será retornado. Exemplo 2: qual o valor arrecadado em cada mês? Explicação da consulta: foi utilizado o conjunto de meses e o nível Quarter. Como os membros de Quarter não pertencem ao conjunto de meses, o retorno será um conjunto apenas com os meses. Função DrillDownLevel 2 66 DRILLDOWNLEVEL ( [Year - Half Year - Quarter - Month - Date]. [Month].members, [Year - Half Year - Quarter - Month - Date]. [Quarter] ) ON 0 FROM POINTFILMES 33
Função DrillDownLevel 3 67 Se uma expressão de nível for especificada e existir um membro no nível especificado, no conjunto, tal conjunto unido com os membros de cada elemento do mesmo, será retornado.. Exemplo 3: qual o valor arrecadado em cada trimestre e nos seus respectivos meses? Explicação: foi utilizado o conjunto de trimestres e o nível Quarter. Como os membros de Quarter pertencem ao conjunto de trimestres, o retorno será um conjunto apenas com os meses. Função DrillDownLevel 3 68 DRILLDOWNLEVEL ( [Year - Half Year - Quarter - Month - Date]. [Quarter].members, [Year - Half Year - Quarter - Month - Date].[Quarter] ) ON 0 FROM POINTFILMES 34
Função DrillDownLevel 4 69 Exemplo 4: quais os 5 filmes mais locados em cada trimestre? Qual foi a quantidade no trimestre? Qual a quantidade em cada mês do trimestre? Função DrillDownLevel 4 70 DRILLDOWNLEVEL ( [Year - Half Year - Quarter - Month - Date].[Quarter].members, [Year - Half Year - Quarter - Month - Date].[Quarter] ) ON COLUMNS, TOPCOUNT ( [DIM FILME].[Nome].children, 5, [Measures].[FATOS Count] ) ON ROWS FROM PointFilmes where [Measures].[Fatos Count] 35
Função DrillDownMember 71 Função DrillDownMember Acessa os filhos de apenas um dos membros do primeiro conjunto somente quando tal membro pertencer ao segundo conjunto especificado. O retorno são todos os membros do primeiro conjunto unido com os filhos do membro acessado, ordenados pela hierarquia Sintaxe: DrillDownMember ({conjunto1}, {conjunto2}?msdn?) Função DrillDownMember 72 Exemplos: qual o valor total de aluguéis realizados por cada funcionário em todos os anos, mas com ênfase no ano 2007. O resultado é apresentado na figura 9? 36
Função DrillDownMember 73 DRILLDOWNMEMBER ( [Year - Half Year - Quarter - Month - Date]. [Year].members, [Year - Half Year - Quarter - Month - Date]. [Year]. [Calendar 2007] Não é um conjunto ) ON 0, [DIM FUNCIONARIO].[Nome].children ON 1 FROM [PointFilmes]? 74? 37
Referências [1] Business Intelligence, acessado 27/03/2010 url: http://pt.wikipedia.org/wiki/business_intelligence [2]MDX: The Language of Multidimensional Analysis, acessado 22/03/2010 url: http://www.panorama.com/documents/mdxwhitepaper.pdf 75 [3] TUTORIAL: Introduction to Multidimensional Expressions (MDX), acessado 22/03/2010 url: http://www.fing.edu.uy/inco/grupos/csi/esp/cursos/cursos_ act/2005/dap_sistdw/material/2-sdw-laboratorio1-2005.pdf Referências [4] bda_mdx.pdf, acessado 22/03/2010 url: http://www.cin.ufpe.br/~if695/ 76 [5] Mdx allows complex, multidimensional queries, acessado 22/03/2010 url: http://www.oracle.com/technology/products/bi/epm/pdf/mdx_co mplex_queries.pdf [6] MDX at First Glance: Introduction to SQL Server MDX Essentials, acessado em 01/04/2010 url: http://www.databasejournal.com/features/mssql/article.php/1495 511/MDX-at-First-Glance-Introduction-to-SQL-Server-MDX- Essentials.htm 38
Referências [7] MDX Tutorials, acessado 01/04/2010 url: http://www.mdxtutorials.net/ 77 [8] Multidimensional Expressions (MDX) Reference, acessado 14/04/2010 url: http://msdn.microsoft.com/ptbr/library/ms145506%28v=sql.100%29.aspx 39