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]