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:

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.Basic

SELECT 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:

  1. Crie uma pasta para armazenar consultas de amostra que podem ser executadas no cubo Sample.Basic.

  2. Usando um editor de texto, digite o seguinte código em um arquivo em branco:

    SELECT
      {}
    ON COLUMNS
    FROM Sample.Basic
  3. Salve o arquivo como qry_blank.txt.

Conjuntos e Tuplas MDX

Os conjuntos MDX contêm dois e as tuplas MDX contêm nomes de membros. Saiba a diferença entre conjuntos, tuplas e nomes de membros e como eles se encaixam nas consultas MDX do Essbase.

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 como StrToMbr("&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:

  1. Abra qry_blank.txt, o modelo de consulta que você criou em Criar um Modelo de Consulta MDX.

  2. 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
  3. Salve a consulta como qry_first.txt.

  4. Certifique-se de que o Essbase esteja em execução.

  5. 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";
  6. Copie e cole toda a consulta SELECT no Cliente MaxL, mas ainda não pressione Enter.

  7. 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).

  8. 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.Basic

Pelo 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:

  1. Abra o qry_blank.txt, o modelo de consulta criado em Criar um Modelo de Consulta MDX.

  2. Adicione uma vírgula após ON COLUMNS; em seguida, adicione um espaço reservado para um segundo eixo adicionando ON ROWS:

    SELECT
      {}
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  3. Salve o novo modelo de consulta como qry_blank_2ax.txt.

  4. 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.Basic

    Como 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.

  5. 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
  6. Salve a consulta como qry_2ax.txt.

  7. 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

A imagem de um espaço é usada para células thead vazias 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:

  1. Abra qry_blank_2ax.txt, o modelo de consulta que você criou no exercício anterior.

  2. 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
  3. 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
  4. Salve a consulta como qry_1ax.txt.

  5. 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

    A imagem de um espaço é usada para células thead vazias A imagem de um espaço é usada para células thead vazias 100-10 100-20
    A imagem de um espaço é usada para células thead vazias A imagem de um espaço é usada para células thead vazias

    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

Você pode usar funções MDX para operar em metadados ou dados do Essbase. As funções podem retornar membros, conjuntos, valores, tuplas ou strings. Eles são úteis se você estiver usando MDX para analisar, atualizar ou exportar dados.

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:

  1. Abra o qry_blank.txt, o modelo de consulta criado em Criar um Modelo de Consulta MDX.

  2. Exclua os colchetes {}, que são desnecessários quando você está usando uma função para retornar o conjunto.

  3. Use o operador dois-pontos para selecionar um intervalo de membros de Trim1 a Trim4:

    SELECT 
      [Qtr1]:[Qtr4]
    ON COLUMNS 
    FROM Sample.Basic
  4. 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.

  5. Use a função MemberRange para selecionar o mesmo intervalo de membros, Trim1 a Trim4.

    SELECT
      MemberRange([Qtr1],[Qtr4])
    ON COLUMNS
    FROM Sample.Basic
  6. Cole a consulta no MaxL Client e execute-a.

  7. 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:

  1. Abra o qry_blank.txt, o modelo de consulta criado em Criar um Modelo de Consulta MDX.

  2. Substitua as chaves {} do eixo das colunas por CrossJoin().

    SELECT
      CrossJoin () 
    ON COLUMNS, 
      {}
    ON ROWS
    FROM Sample.Basic
  3. 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
  4. 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
  5. 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
  6. Salve a consulta como qry_crossjoin_func.txt.

  7. 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

A imagem de um espaço é usada para células thead vazias A imagem de um espaço é usada para células thead vazias 100-10 100-10 100-10 100-10
A imagem de um espaço é usada para células thead vazias A imagem de um espaço é usada para células thead vazias

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:

  1. Abra qry_crossjoin_func.txt, a consulta que você criou no exercício anterior.

  2. 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
  3. Salve a consulta como gry_children_func.txt.

  4. 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, States ou Regions.

  • O nome da dimensão junto com o nome da geração ou do nível; por exemplo, Market.Regions e [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].Level retorna 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].Generation retorna 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:

  1. Abra o qry_blank.txt, o modelo de consulta criado em Criar um Modelo de Consulta MDX.

  2. Exclua os colchetes {}, que são desnecessários quando você está usando uma função para retornar um conjunto.

  3. 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
  4. Salve a consulta como qry_members_func.txt.

  5. 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 slicer

Use 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:

  1. Abra gry_crossjoin_func.txt, a consulta que você criou no Exercício 6 de Usar Funções MDX para Criar Conjuntos.

  2. 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.

  3. 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)
  4. Cole a consulta no MaxL Client e execute-a.

  5. Observe que o valor para a tupla ([Cola],[East],[Sales],[Qtr1]) agora é 5020.

  6. 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

Filhos

Retorna os filhos do membro de entrada.

Equivalentes

Retorna os irmãos do membro de entrada

Descendentes

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

Ancestral

Retorna um antecessor na camada especificada.

Primo

Retorna um membro filho na mesma posição que um membro de outro antecessor.

Pai

Retorna o pai do membro de entrada.

Primeiro filho

Retorna o primeiro filho do membro de entrada.

Último filho

Retorna o último filho do membro de entrada.

Primeiro Irmão

Retorna o primeiro filho do pai do membro de entrada.

Último Irmão

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:

  1. Clique em um link para uma função em uma das tabelas acima ou clique em Filhos.

  2. Leia o exemplo e copie a consulta SELECT para sua área de transferência.

  3. 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

Você pode usar essas funções MDX com o Essbase para comparar, unir, combinar ou reduzir conjuntos: CrossJoin, CrossJoinAttribute, Distinct, Except, Generate, Head, Intersect, Subset, Tail e Union.

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

CrossJoin, CrossJoinAttribute

Retorna uma seção cruzada de dois conjuntos de diferentes dimensões.

Distinto

Exclui tuplas duplicadas de um conjunto.

Exceto

Retorna um subconjunto contendo as diferenças entre dois conjuntos.

Gerar

Uma função iterativa. Para cada tupla no set1, retorna set2.

Head

Retorna os primeiros n membros ou tuplas presentes em um conjunto.

Interseção

Retorna a interseção de dois conjuntos de entrada.

Subconjunto

Retorna um subconjunto de um conjunto, em que o subconjunto é uma faixa de tuplas especificada numericamente.

Ajuste

Retorna os últimos n membros ou tuplas presentes em um conjunto.

União

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])
  1. Abra o qry_blank.txt, o modelo de consulta criado em Criar um Modelo de Consulta MDX.

  2. Exclua as chaves de conjunto vazias {} do eixo e substitua-as por Intersect(). Deixe algum espaço dentro das chaves de interseção para adicionar mais código. Por exemplo:

    SELECT
       Intersect (
    
       )
    ON COLUMNS
    FROM Sample.Basic
  3. 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
  4. Especifique filhos de Leste como o primeiro argumento set. Por exemplo:

    SELECT
       Intersect (
       { [East].children },
       { }
       )
    ON COLUMNS
    FROM Sample.Basic
  5. 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
  6. 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
  7. 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])
  1. Abra qry_intersect_func.txt, a consulta que você criou no exercício anterior.

  2. Substitua Intersecção por União.

  3. Salve a consulta como qry_union_func.txt.

  4. 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.Basic

A 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.Basic

Exercí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)
  1. 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
  2. No conjunto de eixos da linha, especifique os filhos do Produto. Por exemplo:

    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
  3. 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
  4. 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
  5. 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
    
  6. 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
    
  7. Salve a consulta como gry_calc_member.txt.

  8. 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

    A imagem de um espaço é usada para células thead vazias 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

Filtro

Retorna o subconjunto de tuplas em set cujo valor da condição de pesquisa é TRUE.

IIF

Executa um teste condicional e retorna uma expressão numérica ou conjunto apropriado, dependendo se o teste é avaliado como VERDADEIRO ou FALSO.

Caso

Executa testes condicionais e retorna os resultados especificados.

Gerar

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.Basic

A 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:

Uma linha de valores #MISSING para Trim1, Real

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 &CurMonth na 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.Basic

Quando 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.Basic

Pesquisar 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.Basic

Ao 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.Basic

Chamando 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.Basic

A 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.Basic

Quando 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.Basic

Quando 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.Basic

Valores 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.Basic

Nenhum 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.Basic

Alé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