Pergunta

Eu sou novo para MDX e sei que esta deve ser uma pergunta simples, mas eu não tenho sido capaz de encontrar uma resposta.

Estou modelando um questionário que tem perguntas e respostas. O que estou tentando alcançar é para descobrir o número de pessoas que deram respostas específicas para perguntas., Por exemplo, o número de homens com idade entre 20-25

Quando eu executar a consulta a seguir para as perguntas individualmente o resultado correto é retornado

SELECT
      [Measures].[Fact Demographics Count] ON Columns
FROM
      [Dsv All]            
WHERE
      [Answer].[Dim Answer].&[1]

[Measures].[Fact Demographics Count] é uma contagem da coluna de chave primária

[Answer].[Dim Answer].&[1] é a chave para a resposta Masculino

Resultado para o número de pessoas que são do sexo masculino = 150 Resultado para o número de pessoas que estão entre 20-25 = 12

Mas quando eu executar a próxima consulta abaixo, em vez de obter o número de pessoas que são do sexo masculino e com idade entre 20-25. Tenho a soma do número de pessoas que são do sexo masculino e do número de pessoas que estão entre 20-25.

SELECT 
      [Measures].[Fact Demographics Count] ON Columns
FROM
      [Dsv All]            
WHERE
      {[Answer].[Dim Answer].&[1],[Answer].[Dim Answer].&[9]}

resultado = 162

A estrutura da tabela de fato é

FactDemographicsKey,

RespodentKey,

QuestionKey,

AnswerKey

Qualquer ajuda seria muito apreciada

Graças

Foi útil?

Solução 3

Em primeiro lugar obrigado a todos por suas respostas. Este foi interessante para resolver e para alguém novo para MDX e vindo de SQL a uma armadilha fácil de cair.

Assim, para os interessados ??aqui é uma visão breve da solução.

Eu tenho 3 tabelas

  1. factDemographics: detém entrevistados e suas respostas (quem respondeu o)

  2. dimAnswer: as respostas

  3. dimRespondent: os entrevistados

Na visão fonte de dados para o cubo Eu dupliquei factDemographics 5 vezes usando consultas nomeadas e eu nomeei estes fact1, fact2, ..., fact5. (O qual vai criar 5 grupos de medidas)

Usando criar cubo de VS Estúdio assistente I definir as seguintes tabelas de fatos

  1. fact1, fact2, ... como tabelas de fatos
  2. dimRespondent uma tabela de fatos. Eu uso esta tabela para obter o número de respondentes.
  3. Removido tabela de factDemographics originais.

Uma vez que o cubo foi criado eu duplicado a dimensão dimAnswer 5 vezes, nomeando-os filter1, filter2, ...

Finalmente, na guia Uso Dimensão da Estrutura Cube I ligada estes juntos como segue

filter1 muitos para muitos dimRespondent

filter2 muitos para muitos dimRespondent

filter3 muitos para muitos dimRespondent

filter4 muitos para muitos dimRespondent

filter5 muitos para muitos dimRespondent

filter1 relação regular fact1

filter2 relação regular fact2

filter3 relação regular fact3

filter4 relação regular fact4

filter5 relação regular fact5

Isso agora me permite reescrever a consulta que eu usei no meu post original como

SELECT
    [Measures].[Dim Respondent Count] On 0
FROM
    [DemographicsCube]
WHERE
    (
        [Filter1].[Answer].&[Male],
        [Filter2].[Answer].&[20-25]
    )

O meu consulta pode agora ser filtrados por até 5 perguntas.

Embora isso funciona Eu tenho certeza que há uma solução mais elegante. Se alguém sabe o que é isso eu adoraria ouvi-lo.

Graças

Outras dicas

Dê uma olhada na função FILTER MDX - o que pode lhe dar o que você precisa. Uma combinação de FILTER e propriedades membros para filtrar contra os de ID pode fazê-lo. Você está tendo um problema, porque o que você está tentando fazer é um pouco contra a corrente de como um cubo OLAP é estruturada (a partir de minha experiência), porque Idade e sexo são ambos membros da mesma dimensão (as respostas), o que significa que cada um deles obter suas próprias células para a agregação, mas ao contrário, se Idade e sexo foram cada um em sua própria dimensão, eles não são agregadas com relação um ao outro, exceto para se somados. Em um cubo OLAP, cada combinação de cada membro de cada dimensão com cada membro de todas as outras dimensões recebe uma "célula" com o valor de cada medida que é exclusivo para essa combinação - que é o que você quer, mas os membros da mesma dimensão (tais como respostas) não são cruzada calculado desta forma.

Se possível, eu recomendo quebrar as respostas individuais em dimensões individuais, ou seja, Idade e sexo cada um tem suas próprias dimensões com seus próprios membros, então o que você quer fazer fluirá naturalmente fora de seu cubo. Caso contrário, eu tenho medo que você vai ter muita MDX fiddelry para fazer. (Eu não sou um especialista MDX, no entanto, para que eu pudesse estar completamente fora da base em um presente, mas esse é o meu entendimento)

Além disso, definitivamente ler o livro mencionado anteriormente, MDX Solutions, a menos que esta é a única MDX consulta que você acha que vai precisar para escrever. MDX e análise multidimensional são nada como SQL, e uma sólida compreensão da estrutura de um banco de dados OLAP e MDX, em geral, é absolutamente essencial, e que o livro faz um trabalho muito, muito agradável de você ficar onde necessidade de ser nesse departamento.

Quando tentando descobrir problemas com Where-critério ou fatias acho que é útil para quebrar os itens que você está cortando em em dimensões, em vez de medidas.

select
      [Measures].[Fact Demographics Count] on Columns
from  [Dsv All]            
where
{
    [Answer].[Dim Answer].&[1],
    [Dim Age Band].[20-25]
}

Embora então você não está realmente usando o poder da MDX -. Você está recebendo apenas um valor

select
      [Dim Answer].Members on Columns,
      [Dim Age Band].Members on Rows
from  [Dsv All] 
where ( [Measures].[Fact Demographics Count] )

Vamos dar-lhe uma tabela dinâmica (ou cruzada) quebrar género (em colunas) por idade-bandas (em linhas).

Entre - ff você está aprendendo MDX este livro: MDX Solutions é de longe o melhor ponto que eu encontrei começando.

Se você estiver usando MSSQL, você pode usar o "COM ROLLUP" para obter algumas linhas extras que teriam as informações que deseja. Além disso, você não está usando um "GROUP BY", que você vai precisar.

Use o GROUP BY para quebrar o conjunto em grupos e, em seguida, usar funções agregadas para obter suas contagens e outras estatísticas.

Exemplo:

select AGE, GENDER, count(1)
from MY_TABLE
group by AGE, GENDER
with rollup

Isto lhe daria o número de cada gênero de pessoa em sua mesa em cada faixa etária, eo "cumulativo" iria dar-lhe o número total de pessoas em sua mesa, os números em cada grupo de idade, independentemente do sexo, e os números de cada sexo independentemente da idade. Algo como

AGE GENDER COUNT
--- ------ -----
 20      M  1245
 21      M  1012
 20      F   942
 21      F   838
         M  2257
         F  1780
 20         2187
 21         1850
            4037
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top