MDX Essencial: Consultas e Membros Calculados em OLAP

O que é MDX?

MDX (Multi-Dimensional eXpressions) é uma linguagem definida pela Microsoft para consultas em servidores OLAP. Podemos usar o MDX para criar consultas em modelos multidimensionais ou para criar membros calculados (medidas).

Sintaxe Básica do MDX

A sintaxe fundamental para uma consulta MDX é:

SELECT <set> ON COLUMNS,
<set> ON ROWS
FROM [<cube_name>]

Identificadores

Identificadores são os nomes dos objetos do serviço de análise (cubos, dimensões, hierarquias, níveis, membros, etc.).

Normalmente, são acompanhados de colchetes (“[]“). No entanto, se o nome for simples e respeitar algumas regras (ex: iniciar com letras A-Z, não ter caracteres especiais ou não ser uma palavra reservada), é possível utilizá-los sem os colchetes.

Exemplo:

Product.members
[Product].[AllProducts]

Eixos (Axes)

Os eixos em MDX definem a estrutura da sua consulta:

  • 0: Indica as colunas
  • 1: Indica as linhas

Veja um exemplo de uso dos eixos:

SELECT [Customers].[Geography].[Region].[Europe].[France] ON 0,
[Product].[Product].[Company].[icCube] ON 1
FROM [Sales]

Exemplos de Consultas MDX

Exemplo 1: Consulta Simples

Este exemplo demonstra uma consulta básica selecionando membros específicos para colunas e linhas.

SELECT [Customers].[Geography].[Region].[Europe].[France] ON 0,
[Product].[Product].[Company].[icCube] ON 1
FROM [Sales]

Exemplo 2: Múltiplos Valores por Linha

Mostrando mais de um valor por linha:

SELECT [Customers].[Geography].[Region].[Europe] ON 0,
{[Measures].[Count], [Measures].[Amount]} ON 1
FROM [Sales]

Exemplo 3: Todos os Membros de um Nível

Mostrando todos os membros de determinado nível:

SELECT [Customers].[Geography].[Country].members ON 0,
{[Measures].[Count], [Measures].[Amount]} ON 1
FROM [Sales]

Especificando Membros

Para selecionar membros específicos, você pode usar a propriedade .children ou referenciar o membro diretamente.

SELECT [Time].[Year].children ON 1,
[Measures].[Amount] ON 0
FROM [Sales]

Como mostrar apenas 2007?

SELECT [Time].[Year].&[2007] ON 1,
[Measures].[Amount] ON 0
FROM [Sales]

E se você quiser mostrar os valores de 2007 e 2009, mas apenas considerando a região da França?

SELECT {[Time].[Year].&[2007], [Time].[Year].&[2009]} ON 1,
[Measures].[Amount] ON 0
FROM [Sales]
WHERE ([Customers].[Geography].[Region].[Europe].[France])

Membros Calculados

Membros calculados são expressões criadas por uma combinação de identificadores, valores e operações, com o intuito de obter um resultado. É a funcionalidade mais utilizada no MDX.

Permitem criar novos membros (medidas, dimensões, etc.) com WITH MEMBER antes da cláusula SELECT.

Normalmente, possuem três tipos: Constantes, Funções e Objetos.

Exemplos de Membros Calculados

Constantes

Um membro calculado pode ser uma constante, como no exemplo abaixo:

WITH
MEMBER MEASURES.QTDEMINIMA AS 10
SELECT
{QTDEMINIMA } ON 0,
[Time].[Year].MEMBERS ON 1
FROM [Sales]
Funções e Cálculos

Membros calculados podem incorporar funções e realizar cálculos complexos:

WITH
MEMBER Measures.[NomeMembro] AS [Time].[Year].CURRENTMEMBER.NAME
MEMBER Measures.[CalculoValor] AS Measures.Amount * 0.95
SELECT
{ Measures.[NomeMembro], Measures.[CalculoValor], Measures.Amount} ON 0,
[Time].[Year].MEMBERS ON 1
FROM [Sales]

Funções de Conjunto (Set Functions)

As funções de conjunto servem para manipular hierarquias, dimensões e medidas de diversas maneiras. Existem muitas, mas vamos aprender as principais.

Função de Conjunto: CROSSJOIN

A função CROSSJOIN serve para criar combinações de dimensões.

SELECT
[Measures].MEMBERS ON COLUMNS,
CROSSJOIN ([Time].[Year].[Year].MEMBERS,
[Customers].[Geography].[Region].MEMBERS) ON ROWS
FROM [Sales]

Função de Conjunto: DESCENDANTS

A função DESCENDANTS serve para retornar um nível da hierarquia a partir de qualquer membro pai.

SELECT
[Measures].[Amount] ON COLUMNS,
DESCENDANTS ([Customers].[Geography].[Region].[Europe],
[Customers].[Geography].[City]) ON ROWS
FROM [Sales]

Função de Conjunto: ORDER

A função ORDER serve para ordenar em ordem crescente ou decrescente (ORDER BY). Podemos usar BASC (crescente) e BDESC (decrescente) como parâmetros.

SELECT
[Measures].[Amount] ON COLUMNS,
ORDER( [Customers].[Geography].[Region].[Europe].Children, -- Elementos/objetos que serão ordenados
[Geography].CurrentMember.Name, -- Valor do elemento (para ordenação)
BASC) ON ROWS -- Crescente ou decrescente
FROM [Sales]

Função de Conjunto: EXCEPT

A função EXCEPT retorna todos os elementos, exceto os que foram especificados. Representa uma exclusão.

SELECT
[Measures].[Count] ON COLUMNS,
EXCEPT([Time].[Year].[Year],
{[Time].[Year].[Year].&[2008], [Time].[Year].[Year].&[2009]}) ON ROWS
FROM [Sales]

Condicional IIF

A função condicional IIF permite definir um valor com base em uma expressão lógica:

  • IIF(Logical_Expression, Valor_se_verdadeiro, Valor_se_falso)
WITH
MEMBER [Measures].[Verificacao] AS IIF([Measures].[Count] > 315, 'VERDADEIRO', 'FALSO')
SELECT
{[Measures].[Count], [Measures].[Verificacao]} ON COLUMNS,
NonEmpty([Time].[Year].[Year]) ON ROWS
FROM [Sales]