Uma pergunta simples MDX
-
06-09-2019 - |
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
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
-
factDemographics: detém entrevistados e suas respostas (quem respondeu o)
-
dimAnswer: as respostas
-
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
- fact1, fact2, ... como tabelas de fatos
- dimRespondent uma tabela de fatos. Eu uso esta tabela para obter o número de respondentes.
- 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