28 Gravar Consultas MDX
MDX é uma linguagem semelhante a SQL que você pode usar para emitir consultas que recuperam dados do Essbase. MDX também é usado para definir fórmulas em cubos ASO, consultar metadados, qualificar nomes de membros e delinear subconjuntos de dados ou metadados. A melhor maneira de aprender MDX é escrever consultas.
Esta seção ajuda você a aprender MDX escrevendo consultas no cubo Sample Basic em uma série de exercícios.
Pré-requisitos para Gravar Consultas MDX
Para completar os exercícios, você precisará de:
-
um editor de texto, para escrever as consultas MDX.
-
Acesso a uma instância do Essbase com Sample Basic.
Se você precisar obter Amostra Básica, siga as etapas em Criar um Cubo de Amostra para Explorar Propriedades do Outline (apenas faça a importação e ignore a definição das propriedades do outline).
-
Cliente MaxL, para emitir as consultas ao Essbase.
Criar um Modelo de Consulta MDX
Aprenda o formato básico de uma consulta MDX, para que possa começar a usar o MDX com o Essbase. Da mesma forma que as instruções SQL, as consultas MDX geralmente começam com SELECT.
Nesta seção você vai criar um modelo para usar como base para o desenvolvimento de consultas MDX simples.
A maioria das consultas pode ser criada com base na seguinte estrutura gramatical:
SELECT
{}
ON COLUMNS
FROM Sample.BasicSELECT na linha 1 é a palavra-chave que inicia o corpo principal das instruções MDX.
As chaves { } na linha 2 são um espaço reservado para um conjunto. Na consulta acima, o conjunto está vazio, mas as chaves permanecem como um espaço reservado.
Exercício 1: Criar um Modelo de Consulta MDX
Para criar um modelo de consulta:
-
Crie uma pasta para armazenar consultas de amostra que podem ser executadas no cubo Sample.Basic.
-
Usando um editor de texto, digite o seguinte código em um arquivo em branco:
SELECT {} ON COLUMNS FROM Sample.Basic -
Salve o arquivo como
qry_blank.txt.
Conjuntos e Tuplas MDX
Grave sua primeira consulta e execute-a no Cliente MaxL para recuperar alguns dados do cubo Básico de Amostra.
Conjuntos
Um conjunto MDX pode estar vazio, ser uma coleção de tuplas ou uma coleção de conjuntos.
Por exemplo, o seguinte é um conjunto vazio.
{ }Um conjunto deve ser colocado entre chaves {}, exceto nos casos em que o conjunto é representado por uma função MDX que retorna um conjunto (mais sobre funções posteriormente).
O seguinte é um conjunto que consiste em uma tupla.
{[Cola]}
Na consulta a seguir, {([Cola], [Actual])} também é um conjunto que consiste em uma tupla, embora, nesse caso, a tupla tenha mais de um nome de membro.
SELECT
{([Cola], [Actual])}
ON COLUMNS
FROM Sample.Basic{([Cola], [Actual])} é uma tupla que consiste em dois membros (Cola e Real) de duas dimensões (Produto e Cenário).
Regra de Dimensionalidade
Quando um conjunto tem várias tuplas, os membros de cada tupla devem representar as mesmas dimensões do Essbase, na mesma ordem. Em outras palavras, todas as tuplas devem ter a mesma dimensionalidade das outras.
-
OK: O seguinte conjunto consiste em duas tuplas da mesma dimensionalidade:
{(West, Feb), (East, Mar)} -
Não OK: O seguinte conjunto quebra a regra de dimensionalidade, porque Fev e Vendas são de dimensões diferentes:
{(West, Feb), (East, Sales)} -
Não OK: O conjunto a seguir quebra a regra de dimensionalidade, porque embora as duas tuplas contenham as mesmas dimensões, a ordem das dimensões é invertida na segunda tupla:
{(West, Feb), (Mar, East)}
Tuplas e Nomes de Membros
Uma tuple é uma forma de se referir a um membro ou a uma combinação de membros de qualquer número de dimensões. Por exemplo, no cubo Sample.Basic, todas essas são tuplas válidas:
Jan(Jan, Sales)([Jan],[Sales],[Cola],[Utah],[Actual])
Os nomes dos membros podem ser especificados das seguintes maneiras:
-
Especificando o nome real ou o alias; por exemplo:
-
Cola -
Actual -
COGS -
[100]
Se o nome do membro começar com número ou contiver espaços, ele deverá estar entre colchetes; por exemplo,
[100]ou[New York]. No entanto, os colchetes de nomes de membros são recomendados para todos os nomes de membros, para fins de clareza e legibilidade de código.Se o nome do membro começar com um E comercial (&) , ele deverá estar entre aspas; por exemplo,
["&xyz"]. Isso ocorre porque o E comercial principal é reservado para variáveis de substituição (consulte Variáveis em Consultas MDX). Você também pode especificá-lo comoStrToMbr("&100").Para membros de atributo, o nome longo (qualificado para identificar exclusivamente o membro) deve ser usado; por exemplo,
[Ounces_12]em vez de[12]. -
-
Especificando o nome da dimensão ou qualquer um dos nomes de membro antecessor como prefixo do nome do membro; por exemplo,
[Product].[100-10]e[Diet].[100-10]. Esta prática é recomendada para todos os nomes de membros, pois elimina a ambiguidade e permite que você faça referência com precisão aos membros compartilhados. Consulte: "Membros Qualificados por Diferenciar Antecessores" em Duplicar Nomes de Membros em Outlines.Observação:
Não use vários antecessores na qualificação do nome do membro. O Essbase retornará um erro se vários antecessores forem incluídos. Por exemplo,
[Market].[New York]e[East].[New York]são nomes válidos para Nova York; no entanto,[Market].[East].[New York]retorna um erro. -
Especificando o nome de um membro calculado definido na Seção WITH.
Exercício 2: Executar sua Primeira Consulta
Lembre-se de que as chaves {} na linha 2 do seu modelo de consulta são um espaço reservado para um conjunto. Neste exercício, adicionaremos um conjunto à consulta e o executaremos.
Para executar a consulta:
-
Abra
qry_blank.txt, o modelo de consulta que você criou em Criar um Modelo de Consulta MDX. -
Como um conjunto pode ser tão simples quanto uma tupla, adicione a tupla entre as chaves
{ }que mantêm o conjunto.Digite
[Jan]dentro das chaves{ }na linha 2:SELECT {[Jan]} ON COLUMNS FROM Sample.Basic -
Salve a consulta como
qry_first.txt. -
Certifique-se de que o Essbase esteja em execução.
-
Inicie o Cliente MaxL e faça log-in com um nome de usuário e uma senha válidos. Por exemplo:
login admin1 my_Pa55w0rD on "https://myserver.example.com:9001/essbase/agent"; -
Copie e cole toda a consulta SELECT no Cliente MaxL, mas ainda não pressione Enter.
-
Informe um ponto-e-vírgula no final, em qualquer lugar após Básico, mas antes de pressionar Enter. (O ponto e vírgula não é um requisito MDX, mas exigido pelo Cliente MaxL para indicar o fim de uma instrução).
-
Pressione Enter para enviar a consulta para o Essbase.
Os resultados devem ser semelhantes aos seguintes:
Jan 8024
Layout de Consulta MDX com Eixos e Especificação de Cubo
Um eixo MDX é uma instrução que molda o layout de grade dos resultados da consulta de um cubo do Essbase. ON COLUMNS e ON ROWS são palavras-chave de eixo que descrevem onde os resultados devem aparecer. Uma especificação de cubo inclui a palavra-chave FROM e informa ao Essbase qual cubo consultar.
Eixo MDX
Os eixos se encaixam nas consultas MDX após a seleção:
SELECT <axis> [, <axis>...]
FROM <database> Na consulta a seguir, a especificação do eixo é {Jan} ON COLUMNS:
SELECT
{Jan} ON COLUMNS
FROM Sample.BasicPelo menos um eixo deve ser especificado em qualquer consulta MDX.
Até 64 eixos podem ser indicados, começando com AXIS(0) e continuando com AXIS(1)... Eixo(63). Usar mais de três eixos é incomum. A ordem dos eixos não é importante; no entanto, quando um conjunto de eixos 0 a n é especificado, nenhum eixo entre 0 e n deve ser ignorado. Além disso, uma dimensão não pode aparecer em vários eixos.
Os cinco primeiros eixos têm aliases de palavra-chave, conforme listados na tabela a seguir:
Tabela 28-1 Aliases de Palavra-chave de Eixos
| Alias da palavra-chave Axes | Eixos |
|---|---|
|
EM COLUNAS |
Pode ser usado no lugar de AXIS(0) |
|
EM LINHAS |
Pode substituir o AXIS(1) |
|
EM PÁGINAS |
Pode substituir o AXIS(2) |
|
EM CAPÍTULOS |
Pode substituir o AXIS(3) |
|
NAS SEÇÕES |
Pode substituir o AXIS(4) |
Especificação de Cubo MDX
Uma especificação de cubo é a parte da consulta que determina qual banco de dados do Essbase está sendo consultado. A especificação do cubo se encaixa em uma consulta MDX da seguinte forma:
SELECT <axis> [, <axis>...]
FROM <cube> A seção <cube> segue a palavra-chave FROM e deve consistir em identificadores delimitados ou não delimitados que especificam primeiro um nome de aplicativo e um nome de banco de dados; por exemplo, as seguintes especificações são válidas:
-
FROM Sample.Basic -
FROM [Sample.Basic] -
FROM [Sample].[Basic] -
FROM'Sample'.'Basic'
Exercício 3: Executando uma Consulta de Dois Eixos
Para executar uma consulta de dois eixos:
-
Abra o
qry_blank.txt, o modelo de consulta criado em Criar um Modelo de Consulta MDX. -
Adicione uma vírgula após
ON COLUMNS; em seguida, adicione um espaço reservado para um segundo eixo adicionandoON ROWS:SELECT {} ON COLUMNS, {} ON ROWS FROM Sample.Basic -
Salve o novo modelo de consulta como
qry_blank_2ax.txt. -
Como a especificação do conjunto para o eixo da coluna, informe os membros do Produto 100-10 e 100-20. Por exemplo:
SELECT {[100-10],[100-20]} ON COLUMNS, {} ON ROWS FROM Sample.BasicComo esses nomes de membros contêm caracteres especiais, você deve usar colchetes. A convenção usada aqui, para colocar todos os nomes de membros entre colchetes, mesmo que eles não contenham caracteres especiais, é recomendada.
-
Como a especificação do conjunto para o eixo de linha, informe os membros do Ano Trim1 a Trim4.
SELECT {[100-10],[100-20]} ON COLUMNS, {[Qtr1],[Qtr2],[Qtr3],[Qtr4]} ON ROWS FROM Sample.Basic -
Salve a consulta como
qry_2ax.txt. -
Cole a consulta no MaxL Client e execute-a, conforme descrito no primeiro exercício (em MDX Sets and Tuples).
Os resultados da consulta devem ter a seguinte aparência:
Tabela 28-2 Resultados: Executando uma Consulta de Dois Eixos
| 100-10 | 100-20 de | |
|---|---|---|
|
Trim1 |
5.096 |
1.359 |
|
Trim2 |
5.892 |
1.534 |
|
Trim3 |
6.583 |
1.528 |
|
Trim4 |
5.206 |
1.287 |
Exercício 4: Consultando Várias Dimensões em um Único Eixo
Para consultar várias dimensões em um único eixo:
-
Abra
qry_blank_2ax.txt, o modelo de consulta que você criou no exercício anterior. -
No eixo da coluna, especifique duas tuplas, cada uma das quais é uma combinação de membros em vez de um único membro. Coloque cada tupla entre parênteses, porque vários membros são representados em cada tupla.
SELECT {([100-10],[East]), ([100-20],[East])} ON COLUMNS, {} ON ROWS FROM Sample.Basic -
No eixo de linha, especifique quatro tuplas de dois membros, aninhando cada Trimestre com Lucro:
SELECT {([100-10],[East]), ([100-20],[East])} ON COLUMNS, { ([Qtr1],[Profit]), ([Qtr2],[Profit]), ([Qtr3],[Profit]), ([Qtr4],[Profit]) } ON ROWS FROM Sample.Basic -
Salve a consulta como
qry_1ax.txt. -
Cole a consulta no MaxL Client e execute-a, conforme descrito no primeiro exercício (em MDX Sets and Tuples).
Os resultados devem ser semelhantes aos seguintes:
Tabela 28-3 Resultados: Consultando Várias Dimensões em um Único Eixo


100-10 100-20 

Leste
Leste
Trim1
Lucro
2.461
212
Trim2
Lucro
2.490
303
Trim3
Lucro
3.298
312
Trim4
Lucro
2.430
287
Usar Funções MDX para Criar Conjuntos
Aprenda a usar as funções MemberRange e CrossJoin, experimentando os exercícios.
Esta introdução às funções MDX concentra-se em algumas funções que geram conjuntos. Em vez de inserir manualmente conjuntos membro por membro ou tupla por tupla em uma consulta MDX, você pode substituir essas enumerações por uma expressão de função simples. As funções MDX podem retornar conjuntos e outros valores.
Por exemplo, Children é uma função definida. Retorna o conjunto de membros filhos do membro de entrada. Portanto, Children(Qtr1) retorna {Jan, Feb, Mar}.
Os exercícios que se seguem podem ajudá-lo a aprender a usar as funções MDX em consultas simples. Uma referência completa das funções MDX suportadas pelo Essbase é listada na Lista de Funções MDX.
Exercício 5: Usando a Função MemberRange
A função MDX MemberRange retorna um intervalo de membros incluindo e entre dois membros especificados da mesma geração. Sua sintaxe é a seguinte:
MemberRange (<member1>, <member2>, [,<layertype>])onde o primeiro argumento fornecido é o membro que inicia o intervalo, e o segundo argumento é o membro que termina o intervalo. O argumento layertype é opcional.
Observação:
Uma sintaxe alternativa para MemberRange é usar dois-pontos entre os dois membros, em vez de usar o nome da função: member1 : member2.
Para usar a função MemberRange:
-
Abra o
qry_blank.txt, o modelo de consulta criado em Criar um Modelo de Consulta MDX. -
Exclua os colchetes
{}, que são desnecessários quando você está usando uma função para retornar o conjunto. -
Use o operador dois-pontos para selecionar um intervalo de membros de Trim1 a Trim4:
SELECT [Qtr1]:[Qtr4] ON COLUMNS FROM Sample.Basic -
Cole a consulta no MaxL Client e execute-a, conforme descrito no primeiro exercício (em MDX Sets and Tuples).
Qtr1, Qtr2, Qtr3 e Qtr4 são retornados.
-
Use a função MemberRange para selecionar o mesmo intervalo de membros, Trim1 a Trim4.
SELECT MemberRange([Qtr1],[Qtr4]) ON COLUMNS FROM Sample.Basic -
Cole a consulta no MaxL Client e execute-a.
-
Salve a consulta como
gry_member_range_func.txt.
Exercício 6: Usando a Função CrossJoin
A função CrossJoin retorna o produto cruzado de dois conjuntos de diferentes dimensões do Essbase. Sua sintaxe é a seguinte:
CrossJoin(set,set)Esta função usa dois conjuntos de diferentes dimensões como entrada e cria um conjunto que é um produto cruzado deles. Isso é útil para criar relatórios simétricos.
Para usar a função CrossJoin:
-
Abra o
qry_blank.txt, o modelo de consulta criado em Criar um Modelo de Consulta MDX. -
Substitua as chaves
{}do eixo das colunas porCrossJoin().SELECT CrossJoin () ON COLUMNS, {} ON ROWS FROM Sample.Basic -
Adicione dois pares de chaves separados por vírgulas como espaços reservados para os dois argumentos de conjunto que você fornecerá à função CrossJoin:
SELECT CrossJoin ({}, {}) ON COLUMNS, {} ON ROWS FROM Sample.Basic -
No primeiro conjunto, especifique o membro Produto
[100-10]. No segundo conjunto, especifique os membros do Mercado[East],[West],[South]e[Central].SELECT CrossJoin ({[100-10]}, {[East],[West],[South],[Central]}) ON COLUMNS, {} ON ROWS FROM Sample.Basic -
No eixo da linha, use a Junção Cruzada para cruzar um conjunto de membros de Medidas com um conjunto contendo
Qtr1:SELECT CrossJoin ({[100-10]}, {[East],[West],[South],[Central]}) ON COLUMNS, CrossJoin ( {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]} ) ON ROWS FROM Sample.Basic -
Salve a consulta como
qry_crossjoin_func.txt. -
Cole a consulta no MaxL Client e execute-a.
À medida que você experimenta o uso de CrossJoin, observe que a ordem dos argumentos afeta a ordem das tuplas na saída.
Os resultados da consulta são mostrados abaixo:
Tabela 28-4 Resultados: Usando a Função CrossJoin
| 100-10 | 100-10 | 100-10 | 100-10 | ||
|---|---|---|---|---|---|
|
Leste |
Oeste |
Líbano Meridional |
Central |
||
|
Sales |
Trim1 |
5.731 |
3.493 |
2.296 |
3.425 |
|
COGS |
Trim1 |
1.783 |
1.428 |
1.010 |
1.460 |
|
% da Margem |
Trim1 |
66,803 |
59,118 |
56,01 |
57,372 |
|
% de lucro |
Trim1 |
45,82 |
29,974 |
32,448 |
24,613 |
Observação:
Considere usar CrossJoinAttribute se os conjuntos de entrada forem uma dimensão base e sua dimensão de atributo.
Exercício 7: Usando a Função Crianças
A função Filhos retorna um conjunto de todos os membros filhos de um determinado membro. Use esta sintaxe:
Children (member)Observação:
Uma sintaxe alternativa para Filhos é usá-la como um operador no membro de entrada, da seguinte forma: member.Children. Usaremos a sintaxe do operador neste exercício.
Para usar a função Crianças para introduzir um atalho na especificação do primeiro eixo:
-
Abra
qry_crossjoin_func.txt, a consulta que você criou no exercício anterior. -
No segundo conjunto da especificação do eixo da coluna, substitua
[East],[West],[South],[Central]por[Market].Children.SELECT CrossJoin ({[100-10]}, {[Market].Children}) ON COLUMNS, CrossJoin ( {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]} ) ON ROWS FROM Sample.Basic -
Salve a consulta como
gry_children_func.txt. -
Cole a consulta no MaxL Client e execute-a.
Você deverá ver os mesmos resultados que os retornados para o exercício CrossJoin anterior.
Níveis e Gerações de Referência com MDX
Algumas funções MDX executam operações definidas com base em um argumento de camada de entrada. A camada representa uma geração ou um nível de uma dimensão do Essbase. Aprenda a fazer referência a um conjunto usando a função Membros.
No MDX, o conceito de uma camada refere-se a gerações e níveis em uma hierarquia do Essbase.
No Essbase, os números de geração começam a contar com 1 no nome da dimensão; os números de geração mais altos são os mais próximos dos membros da folha em uma hierarquia.
Os números de nível começam com 0 na parte mais folha da hierarquia, e o número de nível mais alto é um nome de dimensão.
Você pode especificar um argumento de camada das seguintes maneiras:
-
Nome de geração ou nível; por exemplo,
StatesouRegions. -
O nome da dimensão junto com o nome da geração ou do nível; por exemplo,
Market.Regionse[Market].[States]. -
A função Níveis com uma dimensão e um número de nível como entrada. Por exemplo,
[Year].Levels(0). -
A função Nível com um membro como entrada. Por exemplo,
[Qtr1].Levelretorna o nível de trimestres em Sample.Basic, que é o nível 1 da dimensão Mercado. -
A função Gerações com uma dimensão e um número de geração como entrada. Por exemplo,
[Year].Generations(3). -
A função Geração com um membro como entrada. Por exemplo,
[Qtr1].Generationretorna a geração de trimestres em Sample.Basic, que é a geração 2 da dimensão Mercado.
Observação:
Na base de dados Sample.Basic, Qtr1 e Qtr4 estão na mesma camada. Isso significa que Qtr1 e Qtr4 também estão na mesma geração. No entanto, em um banco de dados diferente com uma hierarquia irregular, Qtr1 e Qtr4 podem não estar necessariamente no mesmo nível, embora estejam na mesma geração. Por exemplo, se a hierarquia de Trim1 for detalhada até semanas e a hierarquia de Trim4 for interrompida em meses, Trim1 será um nível maior que Trim4, mas ainda estará na mesma camada.
Exercício 8: Usando a Função Membros
Use a função Membros para retornar todos os membros de uma geração ou nível especificado. Quando usada com um argumento de camada, a sintaxe é:
Members (layer)
em que o argumento layer indica a geração ou o nível de membros a serem retornados.
Observação:
Uma sintaxe alternativa para Membros é layer.Members.
Para usar a função Membros:
-
Abra o
qry_blank.txt, o modelo de consulta criado em Criar um Modelo de Consulta MDX. -
Exclua os colchetes
{}, que são desnecessários quando você está usando uma função para retornar um conjunto. -
Use a função Membros e a função Níveis para selecionar todos os membros de nível 0 na dimensão Mercado de Sample.Basic:
SELECT Members(Market.levels(0)) ON COLUMNS FROM Sample.Basic -
Salve a consulta como
qry_members_func.txt. -
Cole a consulta no MaxL Client e execute-a, conforme descrito no primeiro exercício (em MDX Sets and Tuples).
Resultados: Todos os estados na dimensão Mercado são retornados.
Usar um eixo de segmentação para definir o ponto de vista de consulta MDX
Um eixo de segmentação é uma forma de limitar uma consulta MDX para considerar apenas uma área específica do cubo do Essbase. Aprenda a usar a segmentação na cláusula WHERE tentando o exercício de amostra.
A segmentação, se usada, deve estar na seção WHERE de uma consulta MDX. Além disso, a seção WHERE deve ser o último componente da consulta, seguindo a especificação do cubo (a seção FROM):
SELECT {set}
ON axes
FROM cube
WHERE slicerUse o eixo de segmentação para definir o contexto da consulta; geralmente é o contexto padrão para todos os outros eixos.
Para selecionar somente Vendas Reais no cubo Sample.Basic, excluindo vendas orçadas, a cláusula WHERE pode ter a seguinte aparência:
WHERE ([Actual], [Sales])Como (Real, Vendas) é especificado no eixo do fatiador, não é necessário incluí-lo nas especificações do conjunto ON AXIS(n).
Observação:
A mesma dimensão não pode aparecer em outros eixos e no eixo de segmentação. Para filtrar um eixo usando critérios de sua própria dimensão, você pode usar uma subseleção.
Exercício 9: Limitando os Resultados com um Eixo Slicer
Para usar o eixo da segmentação para limitar os resultados:
-
Abra
gry_crossjoin_func.txt, a consulta que você criou no Exercício 6 de Usar Funções MDX para Criar Conjuntos. -
Cole a consulta no MaxL Client e execute-a, conforme descrito no primeiro exercício (em MDX Sets and Tuples).
Observe os resultados em uma das células de dados; por exemplo, observe que a primeira tupla,
([Cola],[East],[Sales],[Qtr1]), tem um valor de 5731. -
Adicione um eixo de segmentação para limitar os dados retornados apenas aos valores orçados.
SELECT CrossJoin ({[100-10]}, {[East],[West],[South],[Central]}) ON COLUMNS, CrossJoin ( {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]} ) ON ROWS FROM Sample.Basic WHERE (Budget) -
Cole a consulta no MaxL Client e execute-a.
-
Observe que o valor para a tupla
([Cola],[East],[Sales],[Qtr1])agora é 5020. -
Salve a consulta como
qry_slicer_axis.txt.
Funções Comuns do Relacionamento MDX
As funções de relacionamento MDX retornam conjuntos ou membros com base em relacionamentos de membros hierárquicos no outline do cubo do Essbase.
As seguintes funções de relacionamento MDX retornam conjuntos.
Tabela 28-5 Lista de Funções de Relacionamento MDX que Retornam Conjuntos
| Função de Relacionamento | Descrição |
|---|---|
|
Retorna os filhos do membro de entrada. |
|
|
Retorna os irmãos do membro de entrada |
|
|
Retorna os descendentes de um membro, com opções variadas. |
As seguintes funções de relacionamento MDX retornam um único membro em vez de um conjunto:
Tabela 28-6 Lista de Funções de Relacionamento MDX que Retornam um Único Membro
| Função de Relacionamento | Descrição |
|---|---|
|
Retorna um antecessor na camada especificada. |
|
|
Retorna um membro filho na mesma posição que um membro de outro antecessor. |
|
|
Retorna o pai do membro de entrada. |
|
|
Retorna o primeiro filho do membro de entrada. |
|
|
Retorna o último filho do membro de entrada. |
|
|
Retorna o primeiro filho do pai do membro de entrada. |
|
|
Retorna o último filho do pai do membro de entrada. |
Exercício 10: Experimente Alguns Exemplos de Funções de Relacionamento na Documentação
Para saber como funcionam as funções de relacionamento:
-
Clique em um link para uma função em uma das tabelas acima ou clique em Filhos.
-
Leia o exemplo e copie a consulta SELECT para sua área de transferência.
-
Cole a consulta no Cliente MaxL, adicione um ponto-e-vírgula de fechamento e execute a consulta, conforme descrito no primeiro exercício (em Conjuntos de MDX e Tuplas).
Funções MDX para Operações Definidas
Aprenda a diferença entre as funções Interseção e União experimentando os exercícios.
As seguintes funções de conjunto operam em conjuntos de entrada sem derivar mais informações de um cubo:
Tabela 28-7 Lista de Funções de Conjunto Puras
| Função do conjunto puro | Descrição |
|---|---|
|
Retorna uma seção cruzada de dois conjuntos de diferentes dimensões. |
|
|
Exclui tuplas duplicadas de um conjunto. |
|
|
Retorna um subconjunto contendo as diferenças entre dois conjuntos. |
|
|
Uma função iterativa. Para cada tupla no set1, retorna set2. |
|
|
Retorna os primeiros n membros ou tuplas presentes em um conjunto. |
|
|
Retorna a interseção de dois conjuntos de entrada. |
|
|
Retorna um subconjunto de um conjunto, em que o subconjunto é uma faixa de tuplas especificada numericamente. |
|
|
Retorna os últimos n membros ou tuplas presentes em um conjunto. |
|
|
Retorna a união de dois conjuntos de entrada. |
Exercício 11: Usando a Função Interseção
A função Interseção MDX retorna a interseção de dois conjuntos de entrada, opcionalmente mantendo duplicatas. Use-o para comparar conjuntos, encontrando tuplas que estão presentes em ambos os conjuntos.
A sintaxe a seguir é:
Intersect (set, set [,ALL])-
Abra o
qry_blank.txt, o modelo de consulta criado em Criar um Modelo de Consulta MDX. -
Exclua as chaves de conjunto vazias
{}do eixo e substitua-as porIntersect(). Deixe algum espaço dentro das chaves de interseção para adicionar mais código. Por exemplo:SELECT Intersect ( ) ON COLUMNS FROM Sample.Basic -
Adicione dois pares de chaves separados por vírgula para usar como espaços reservados para os dois argumentos de conjunto que você fornecerá à função Intersect. Por exemplo:
SELECT Intersect ( { }, { } ) ON COLUMNS FROM Sample.Basic -
Especifique filhos de Leste como o primeiro argumento set. Por exemplo:
SELECT Intersect ( { [East].children }, { } ) ON COLUMNS FROM Sample.Basic -
Para o segundo argumento definido, especifique todos os membros da dimensão Mercado que tenham um UDA de "Maior Mercado". Por exemplo:
SELECT Intersect ( { [East].children }, { UDA([Market], "Major Market") } ) ON COLUMNS FROM Sample.Basic -
Cole a consulta no MaxL Client e execute-a, conforme descrito no primeiro exercício (em MDX Sets and Tuples).
Todos os filhos de Leste que têm um UDA de "Major Market" são retornados. Por exemplo:
New York Massachusetts Florida 8202 6172 5029 -
Salve a consulta como
qry_intersect_func.txt.
Exercício 12: Usando a Função da União
A função União MDX une dois conjuntos de entrada, mantendo, opcionalmente, duplicatas. Use-o para combinar dois conjuntos em um conjunto.
A sintaxe a seguir é:
Union (set, set [,ALL])-
Abra
qry_intersect_func.txt, a consulta que você criou no exercício anterior. -
Substitua Intersecção por União.
-
Salve a consulta como
qry_union_func.txt. -
Cole a consulta no MaxL Client e execute-a.
Enquanto a Intersect devolveu um conjunto contendo apenas as crianças do Leste que têm um UDA do Mercado Principal, a Union retorna um conjunto maior. Inclui todos os filhos do Leste, E todos os membros do Mercado que têm um UDA do Mercado Principal.
(New York) (Massachusetts) (Florida) (Connecticut) (New Hampshire) (East) (California) (Texas) (Central) (Illinois) (Ohio) (Colorado) +---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+--------------- 8202 6712 5029 3093 1125 24161 12964 6425 38262 12577 4384 7227
Conjuntos e Membros Reutilizáveis: Seção MDX WITH
A definição de membros e conjuntos na seção WITH da consulta MDX ajuda a filtrar dados sem afetar o cubo. Um membro calculado é um membro lógico que existe somente dentro da consulta. Um conjunto nomeado é um conjunto lógico que existe apenas dentro da consulta. Tente um exercício de amostra.
Os membros calculados e os conjuntos nomeados são entidades lógicas na consulta que podem ser usadas várias vezes durante a vida da consulta. Os membros calculados e os conjuntos nomeados podem economizar tempo em linhas de código escritas, bem como no tempo de execução. A seção opcional WITH no início de uma consulta MDX é onde você define os membros calculados e/ou conjuntos nomeados.
A consulta a seguir usa um membro calculado:
WITH
MEMBER [Measures].[Max Qtr2 Sales] AS
'Max (
{[Year].[Qtr2]},
[Measures].[Sales]
)'
SELECT
{ [Measures].[Max Qtr2 Sales] } on columns,
{ [Product].children } on rows
FROM Sample.BasicA consulta a seguir usa um conjunto nomeado:
WITH SET [NewSet]
AS 'CrossJoin([Product].Children, [Market].Children)'
SELECT
Filter([NewSet], NOT IsEmpty([NewSet].CurrentTuple))
ON COLUMNS
FROM Sample.Basic
WHERE
{[Sales]}Membros Calculados
Um membro calculado é um membro hipotético que existe durante a execução da consulta. Os membros calculados permitem uma análise complexa sem a necessidade de adicionar membros físicos ao outline do cubo. Os membros calculados armazenam resultados de cálculo executados em membros físicos.
Use as seguintes diretrizes para nomes de membros calculados:
-
Associe o membro calculado a uma dimensão; por exemplo, para associar o membro MyCalc à dimensão Medidas, nomeie-o como
[Measures].[MyCalc]. -
Não use nomes de membros reais para nomear membros calculados; por exemplo, não nomeie um membro calculado
[Measures].[Sales], porque as Vendas já existem na dimensão Medidas.
A definição da ordem de resolução para cada membro calculado é recomendada quando você usa vários membros calculados para criar proporções ou totais personalizados.
Conjuntos Nomeados
Você define conjuntos nomeados usando palavras-chave WITH SET, antes da parte SELECT da consulta. Isso é útil porque você pode fazer referência ao conjunto por nome ao criar a parte SELECT da consulta.
Por exemplo, o conjunto nomeado Best5Prods identifica um conjunto dos cinco produtos mais vendidos em dezembro:
WITH
SET [Best5Prods]
AS
'Topcount (
[Product].members,
5,
([Measures].[Sales], [Scenario].[Actual], [Year].[Dec])
)'
SELECT [Best5Prods] ON AXIS(0),
{[Year].[Dec]} ON AXIS(1)
FROM Sample.BasicExercício 13: Criando um Membro Calculado
Este exercício usa a função Max, uma função MDX comum para cálculos. Retorna o máximo de valores encontrados nas tuplas de um conjunto.
A sintaxe a seguir é:
Max (set, numeric_value)-
Abra
qry_blank_2ax.txt, o modelo de consulta criado no Exercício 3 do Layout de Consulta MDX com Eixos e Especificação de Cubo.SELECT {} ON COLUMNS, {} ON ROWS FROM Sample.Basic -
No conjunto de eixos da linha, especifique os filhos do Produto. Por exemplo:
SELECT {} ON COLUMNS, {[Product].children} ON ROWS FROM Sample.Basic -
No início da consulta, adicione um espaço reservado para a especificação de membro calculada. Por exemplo:
WITH MEMBER [].[] AS '' SELECT {} ON COLUMNS, {[Product].children} ON ROWS FROM Sample.Basic -
Para associar o membro calculado à dimensão Medidas e nomeá-lo como Máximo de Vendas do Trimestre 2, adicione essas informações à especificação do membro calculado. Por exemplo:
WITH MEMBER [Measures].[Max Qtr2 Sales] AS '' SELECT {} ON COLUMNS, {[Product].children} ON ROWS FROM Sample.Basic -
Após a palavra-chave AS e dentro das aspas simples, defina a lógica para o membro calculado chamado Vendas Máximas do Trimestre 2.
Use a função Max com o conjunto para avaliar (Qtr2) como o primeiro argumento, e a medida para avaliar (Sales) como o segundo argumento. Por exemplo:
WITH MEMBER [Measures].[Max Qtr2 Sales] AS ' Max ( {[Year].[Qtr2]}, [Measures].[Sales] )' SELECT {} ON COLUMNS, {[Product].children} ON ROWS FROM Sample.Basic -
O membro calculado Max Qtr2 Sales é definido na seção WITH. Para usá-lo em uma consulta, referencie-o em um dos eixos na parte SELECT da consulta. Por exemplo:
WITH MEMBER [Measures].[Max Qtr2 Sales] AS ' Max ( {[Year].[Qtr2]}, [Measures].[Sales] )' SELECT {[Measures].[Max Qtr2 Sales]} ON COLUMNS, {[Product].children} ON ROWS FROM Sample.Basic -
Salve a consulta como
gry_calc_member.txt. -
Cole a consulta no MaxL Client e execute-a, conforme descrito no primeiro exercício (em MDX Sets and Tuples).
Os resultados da consulta são mostrados abaixo:
Tabela 28-8 Resultados: Criando um Membro Calculado

Vendas Máximas do Trimestre 2 100
27.187
200
27.401
300
25.736
400
21.355
Dieta
26.787
Observação:
Muitos outros exemplos estão disponíveis na documentação de referência MDX. Consulte MDX With Section.
Funções MDX Iterativas
As funções MDX iterativas percorrem conjuntos de dados no cubo do Essbase, executando quaisquer condições de pesquisa que você especificar para adaptar os resultados. Veja um exemplo que filtra dados com base em um teste booliano.
Tabela 28-9 Lista de Funções Iterativas MDX
| Função | Descrição |
|---|---|
|
Retorna o subconjunto de tuplas em set cujo valor da condição de pesquisa é TRUE. |
|
|
Executa um teste condicional e retorna uma expressão numérica ou conjunto apropriado, dependendo se o teste é avaliado como VERDADEIRO ou FALSO. |
|
|
Executa testes condicionais e retorna os resultados especificados. |
|
|
Para cada tupla no set1, retorna set2. |
Exemplo de Função de Filtro
A consulta a seguir usa a função Filtro MDX para retornar todos os membros da dimensão de Mercado para os quais a expressão IsChild([Market].CurrentMember,[East]) retorna TRUE. A consulta retorna todos os filhos de East.
SELECT
Filter([Market].Members,
IsChild([Market].CurrentMember,[East])
)
ON COLUMNS
FROM Sample.BasicA função Filtro no MDX é comparável ao comando RESTRICT no Report Writer.
Tratar Dados Ausentes com MDX
Ao consultar um cubo do Essbase usando MDX, você pode usar as palavras-chave NON EMPTY nos eixos para suprimir células sem valor. As funções MDX que lidam com valores ausentes incluem Média, CoalesceEmpty, IsEmpty, NonEmptyCount e NonEmptySubset. As propriedades NONEMPTYMEMBER e NONEMPTYTUPLE ajudam a filtrar valores vazios de grandes conjuntos de dados.
Incluir as palavras-chave opcionais NON EMPTY antes da especificação de conjunto em um eixo causa a supressão de segmentos nesse eixo que conteriam valores #MISSING inteiramente.
A seguir está a sintaxe de especificação do eixo com NON EMPTY:
<axis_specification> ::=
[NON EMPTY] <set> ON
COLUMNS | ROWS | PAGES | CHAPTERS |
SECTIONS | AXIS (<unsigned_integer>)Para qualquer tupla em um eixo (como (Qtr1, Actual)), um segmento consiste nas células resultantes da combinação dessa tupla com todas as tuplas de todos os outros eixos. Se todos esses valores de célula forem #MISSING, a palavra-chave NON EMPTY causará a eliminação da tupla.
Por exemplo, se um valor em uma linha não estiver vazio, a linha inteira será retornada. A inclusão de NON EMPTY no início da especificação do eixo de linha eliminaria a seguinte fatia de linha do conjunto retornado por uma consulta:

Além de suprimir valores ausentes com NON EMPTY, você pode usar as seguintes funções MDX para lidar com resultados #MISSING:
-
CoalesceEmpty, que pesquisa expressões de valor numérico para valores não #MISSING
-
IsEmpty, que retorna TRUE se o valor de uma entrada numérica-valor-expressão for avaliado como #MISSING
-
Méd., que omite valores ausentes das médias, a menos que você use o indicador IncludeEmpty opcional
A função MDX NonEmptyCount retorna a contagem do número de tuplas em um conjunto que avalia para valores não-#Missing. Cada tupla é avaliada e incluída na contagem retornada por essa função. Se a expressão de valor numérico for especificada, ela será avaliada no contexto de cada tupla, e a contagem de valores não-#Missing será retornada.
Somente em cubos de armazenamento agregados, a função NonEmptyCount é otimizada para que o cálculo da contagem distinta de todas as células possa ser realizado pela varredura do cubo apenas uma vez. Sem essa otimização, o banco de dados é digitalizado tantas vezes quanto o número de células correspondentes à contagem distinta. A otimização NonEmptyCount é acionada quando uma fórmula de membro do outline tem a seguinte sintaxe:
NONEMPTYCOUNT(set, measure, exclude_missing)O parâmetro exclude_missing suporta a otimização NonEmptyCount em bancos de dados agregados, melhorando o desempenho de uma consulta que consulta métricas que executam um cálculo de contagem distinto.
As propriedades de otimização NONEMPTYMEMBER e NONEMPTYTUPLE permitem que o MDX consulte grandes conjuntos de membros ou tuplas ao ignorar a execução da fórmula em valores não contribuintes que contêm apenas dados #MISSING.
-
Use uma única cláusula de propriedade NONEMPTYMEMBER no início de um membro ou expressão de fórmula calculada para indicar ao Essbase que o valor da fórmula ou do membro calculado está vazio quando qualquer um dos membros especificados em nonempty_member_list estiver vazio.
-
Use uma única cláusula de propriedade NONEMPTYTUPLE no início de um membro calculado ou de uma expressão de fórmula para indicar ao Essbase que o valor da fórmula ou do membro calculado está vazio quando o valor da célula na tupla fornecida em nonempty_member_list está vazio.
Dado um conjunto de entradas, a função MDX NonEmptySubset retorna um subconjunto desse conjunto de entradas no qual todas as tuplas são avaliadas como não vazias. Uma expressão de valor opcional pode ser especificada para a verificação não vazia. Esta função pode ajudar a otimizar consultas baseadas em um grande conjunto para o qual o conjunto de combinações não vazias é conhecido por ser pequeno. NonEmptySubset reduz o tamanho do conjunto na presença de uma métrica; por exemplo, você pode solicitar o subconjunto não vazio de descendentes para Unidades específicas.
Variáveis em Consultas MDX
Você pode usar variáveis de substituição predefinidas do Essbase no MDX para fazer referência a informações que mudam com frequência sem alterar suas consultas. Para fazer referência a uma variável em uma consulta ou expressão MDX, informe o nome da variável precedido por um E comercial (&).
As variáveis de substituição no Essbase atuam como espaços reservados para informações que são alteradas regularmente. Defina as variáveis de substituição no cubo, no aplicativo ou no nível global do Essbase e atribua um valor a cada variável. Você pode alterar o valor a qualquer momento. Você deve ter a atribuição de pelo menos o Database Manager para definir variáveis de substituição. Consulte Implementar Variáveis para Alterar Informações.
Para usar uma variável de substituição em uma expressão MDX, considere:
-
A variável de substituição deve estar acessível no aplicativo e no cubo que você está consultando.
-
Uma variável de substituição tem dois componentes: o nome e o valor.
-
O nome da variável pode ser uma combinação alfanumérica cujo tamanho máximo é especificado em Limites de Artefato Relacionado e Nome. Não use espaços, pontuação ou colchetes ([ ]) em nomes de variáveis de substituição usados no MDX.
-
No ponto da expressão em que você deseja usar a variável, informe o nome da variável precedido por um E comercial (&); por exemplo, em que
CurMonthé o nome da variável de substituição definida no servidor, inclua&CurMonthna expressão MDX. -
Quando você executa a recuperação, o Essbase substitui o nome da variável pelo valor de substituição, e esse valor é usado pela expressão MDX.
Por exemplo, a expressão é gravada mostrando o nome da variável CurQtr precedido por &:
SELECT
{[&CurQtr]}
ON COLUMNS
FROM Sample.BasicQuando a expressão é avaliada, o valor atual (Qtr1) é substituído pelo nome da variável, de modo que a expressão executada seja efetivamente:
SELECT
{[Qtr1]}
ON COLUMNS
FROM Sample.BasicPesquisar propriedades em MDX
As propriedades descrevem determinadas características dos dados e metadados do Essbase. O MDX permite gravar consultas que recuperam e analisam dados com base nas propriedades do Essbase, que podem ser intrínsecas ou personalizadas. Você pode chamar propriedades nos eixos de consulta MDX ou em uma expressão de valor.
Propriedades intrínsecas e personalizadas
No MDX, properties descreve certas características de dados e metadados. MDX permite que você escreva consultas que usam propriedades para recuperar e analisar dados. As propriedades podem ser intrínsecas ou personalizadas.
Propriedades intrínsecas
As propriedades intrínsecas são definidas para membros em todas as dimensões. As propriedades de membro intrínsecas definidas para todos os membros em um outline de banco de dados do Essbase são MEMBER_NAME, MEMBER_ALIAS, LEVEL_NUMBER, GEN_NUMBER, IS_EXPENSE, COMMENTS e MEMBER_UNIQUE_NAME.
Consulte Propriedades Intrínsecas MDX para obter uma descrição de cada uma.
Propriedades Personalizadas
O MDX no Essbase suporta dois tipos de propriedades personalizadas: propriedades de atributo e propriedades UDA. As propriedades do atributo são definidas pelas dimensões do atributo em uma estrutura de tópicos. No banco de dados Sample.Basic, a dimensão do atributo Tipo de Pacote descreve as características de empacotamento dos membros na dimensão Produto. Essas informações podem ser consultadas no MDX usando o nome da propriedade [Tipo de Pacote].
As propriedades do atributo são definidas somente para dimensões específicas e somente para um nível específico em cada dimensão. Por exemplo, no outline Sample.Basic, [Ounces] é uma propriedade de atributo definida apenas para membros na dimensão Produto, e essa propriedade tem valores válidos apenas para os membros de nível 0 da dimensão Produto. A propriedade [Ounces] não existe para outras dimensões, como Mercado. A propriedade [Ounces] para um membro que não seja de nível 0 na dimensão Produto é um valor NULL. As propriedades de atributo em um outline são identificadas pelos nomes das dimensões de atributo nesse outline.
As propriedades personalizadas também incluem UDAs. Por exemplo, [Mercado Principal] é uma propriedade UDA definida nos membros da dimensão Mercado. Retorna um valor TRUE se o UDA [Major Market] for definido para um membro e FALSE caso contrário.
Consulte também Propriedades Personalizadas MDX.
Chamando Propriedades em um Eixo de Consulta
Você pode listar as combinações de dimensão e propriedade para cada conjunto de eixos. Quando uma consulta é executada, a propriedade especificada é avaliada para todos os membros da dimensão especificada e incluída no conjunto de resultados.
Por exemplo, no eixo da coluna, a consulta a seguir retorna as informações GEN_NUMBER para cada membro da dimensão Mercado. No eixo da linha, a consulta retorna informações MEMBER_ALIAS para cada membro da dimensão Produto.
SELECT
[Market].Members
DIMENSION PROPERTIES [Market].[GEN_NUMBER] on columns,
Filter ([Product].Members, Sales > 5000)
DIMENSION PROPERTIES [Product].[MEMBER_ALIAS] on rows
FROM Sample.BasicAo consultar propriedades de membro usando a seção DIMENSION PROPERTIES de um eixo, uma propriedade pode ser identificada pelo nome da dimensão e pelo nome da propriedade, ou usando o próprio nome da propriedade. Quando um nome de propriedade é usado por si mesmo, essas informações de propriedade são retornadas para todos os membros de todas as dimensões nesse eixo, às quais essa propriedade se aplica.
Na consulta a seguir, a propriedade MEMBER_ALIAS é avaliada no eixo de linha para as dimensões Ano e Produto.
SELECT [Market].Members
DIMENSION PROPERTIES [Market].[GEN_NUMBER] on columns,
CrossJoin([Product].Children, Year.Children)
DIMENSION PROPERTIES [MEMBER_ALIAS] on rows
FROM Sample.BasicChamando Propriedades em uma Expressão de Valor
As propriedades podem ser usadas dentro de expressões de valor em uma consulta MDX. Por exemplo, você pode filtrar um conjunto com base em uma expressão de valor que usa propriedades de membros no conjunto de entrada.
A consulta a seguir retorna todos os produtos com cafeína que são embalados em latas.
SELECT
Filter([Product].levels(0).members,
[Product].CurrentMember.Caffeinated and
[Product].CurrentMember.[Pkg Type] = "Can")
Dimension Properties
[Caffeinated], [Pkg Type] on columns
FROM Sample.BasicA consulta a seguir calcula o valor [BudgetedExpenses] com base em se o Mercado atual é um mercado principal, usando o UDA [Major Market].
WITH
MEMBER [Measures].[BudgetedExpenses] AS
'IIF([Market].CurrentMember.[Major Market],
[Marketing] * 1.2, [Marketing])'
SELECT {[Measures].[BudgetedExpenses]} ON COLUMNS,
[Market].Members ON ROWS
FROM Sample.Basic
WHERE ([Budget])Tipo de Valor de Propriedades
O valor de uma propriedade MDX no Essbase pode ser um tipo numérico, Booliano ou de string. As propriedades MEMBER_NAME e MEMBER_ALIAS retornam valores de string. As propriedades LEVEL_NUMBER e GEN_NUMBER retornam valores numéricos.
As propriedades do atributo retornam valores numéricos, boolianos ou de string com base no tipo de dimensão do atributo. Por exemplo, em Sample.Basic, a propriedade do atributo [Ounces] é uma propriedade numérica. A propriedade do atributo [Pkg Type] é uma propriedade de string. A propriedade do atributo [Caffeinated] é uma propriedade booleana.
O Essbase permite dimensões de atributo com tipos de data. As propriedades do tipo de data são tratadas como propriedades numéricas no MDX. Ao comparar esses valores de propriedade com datas, use a função Hoje para converter strings de data em numéricas antes da comparação.
A consulta a seguir retorna todos os membros da dimensão Produto que foram introduzidos na data 25/03/2018. Como a propriedade [Data de Introdução] é um tipo de data, a função TODATE deve ser usada para converter a string de data "03-25-2018" em um número antes de compará-la.
SELECT
Filter ([Product].Members,
[Product].CurrentMember.[Intro Date] =
TODATE("mm-dd-yyyy","03-25-2018"))ON COLUMNS
FROM Sample.BasicQuando uma propriedade é usada em uma expressão de valor, você deve usá-la adequadamente com base em seu tipo de valor: string, numérico ou booliano.
Você também pode consultar dimensões de atributo com intervalos numéricos.
A consulta a seguir recupera dados de Vendas para intervalos de população Pequena, Média e Grande.
SELECT
{Sales} ON COLUMNS,
{Small, Medium, Large} ON ROWS
FROM Sample.BasicQuando atributos são usados como propriedades em uma expressão de valor, você pode usar membros de intervalo para verificar se o valor de propriedade de um membro está dentro de um determinado intervalo, usando o operador IN.
Por exemplo, a seguinte consulta retorna todos os membros da dimensão Mercado com a faixa de população em Médio:
SELECT
Filter(
Market.Members, Market.CurrentMember.Population
IN "Medium"
)
ON AXIS(0)
FROM Sample.BasicValores de Propriedade NULL
Nem todos os membros podem ter valores válidos para um determinado nome de propriedade. Por exemplo, a propriedade MEMBER_ALIAS retorna um nome alternativo para um determinado membro, conforme definido no outline; no entanto, nem todos os membros podem ter aliases definidos. Nesses casos, um valor NULL é retornado para os membros que não têm aliases.
Na consulta a seguir,
SELECT
[Year].Members
DIMENSION PROPERTIES [MEMBER_ALIAS]
ON COLUMNS
FROM Sample.BasicNenhum dos membros na dimensão Ano tem aliases definidos para eles. Portanto, a consulta retorna valores NULL para a propriedade MEMBER_ALIAS para membros na dimensão Year.
As propriedades do atributo são definidas para membros de uma dimensão específica e um nível específico nessa dimensão. No banco de dados Sample.Basic, a propriedade [Ounces] é definida somente para membros de nível 0 da dimensão Produto.
Portanto, se você consultar a propriedade [Ounces] de um membro da dimensão Mercado, conforme mostrado na consulta a seguir, obterá um erro de sintaxe:
SELECT
Filter([Market].members,
[Market].CurrentMember.[Ounces] = 32) ON COLUMNS
FROM Sample.BasicAlém disso, se você consultar a propriedade [Ounces] de um membro que não seja de nível 0 da dimensão, obterá um valor NULL.
Ao usar valores de propriedade em expressões de valor, você pode usar a função IsValid() para verificar valores NULL. A consulta a seguir retorna todos os membros da dimensão Produto com um valor de propriedade [Ounces] de 12, após eliminar membros com valores NULL.
SELECT
Filter([Product].Members,
IsValid([Product].CurrentMember.[Ounces]) AND
[Product].CurrentMember.[Ounces] = 12)
ON COLUMNS
FROM Sample.Basic