Question

Je suis nouveau à MDX et je sais que cela doit être une question simple mais je ne l'ai pas été en mesure de trouver une réponse.

Je suis modélisation d'un questionnaire qui a des questions et des réponses. Ce que je suis en train de réaliser est de savoir le nombre de personnes qui ont donné des réponses précises aux questions., Par exemple le nombre d'hommes âgés de 20 à 25

Quand je lance la requête ci-dessous pour les questions individuellement le résultat correct est retourné

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

[Measures].[Fact Demographics Count] est un nombre de la colonne de clé primaire

[Answer].[Dim Answer].&[1] est la clé de la réponse Homme

Résultat nombre de personnes qui sont des hommes = 150 Résultat nombre de personnes qui sont entre 20-25 = 12

Mais quand je lance la prochaine requête ci-dessous plutôt que d'obtenir les gens nombre qui sont les hommes et les personnes âgées entre 20-25. Je reçois la somme du nombre de personnes qui sont les hommes et le nombre de personnes qui sont entre 20-25.

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

result = 162

La structure de la table d'information est

FactDemographicsKey,

RespodentKey,

QuestionKey,

AnswerKey

Toute aide serait grandement appréciée

Merci

Était-ce utile?

La solution 3

Tout d'abord merci à tous pour leurs réponses. Ce fut une intéressante à résoudre et pour tout le monde nouveau pour MDX et provenant de SQL son un piège facile de tomber dans.

Donc, pour ceux qui sont intéressés ici un bref aperçu de la solution.

J'ai 3 tables

  1. factDemographics: détient les répondants et leurs réponses (qui ont répondu à ce que)

  2. dimAnswer: les réponses

  3. dimRespondent: les répondants

Dans la vue du cube source de données pour I 5 fois factDemographics dupliqué à l'aide de requêtes nommées et j'ai nommé ces fact1, fact2, ..., fact5. (Qui va créer 5 groupes de mesures)

Utilisation de l'assistant créer de cube VS Studio Je mis les tables de faits suivants

  1. fact1, fact2, ... sous forme de tableaux de fait
  2. dimRespondent une table de fait. J'utilise ce tableau pour obtenir le nombre de répondants.
  3. Suppression de la table factDemographics originale.

Une fois que le cube a été créé I la dimension dimAnswer dupliqué 5 fois, en les nommant filtre1, filtre2, ...

Enfin, dans l'onglet Utilisation de la dimension de la structure Cube I un lien entre ces ensemble comme suit

filtre1 beaucoup à beaucoup dimRespondent

filtre2 beaucoup à beaucoup dimRespondent

Filtre3 beaucoup à beaucoup dimRespondent

filter4 beaucoup à beaucoup dimRespondent

filter5 beaucoup à beaucoup dimRespondent

filtre1 fact1 relation régulière

filtre2 fact2 relation régulière

Filtre3 fact3 relation régulière

filter4 fait4 relation régulière

filter5 fact5 relation régulière

Cela me permet maintenant de réécrire la requête je dans mon post original

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

Ma requête peut maintenant être filtré jusqu'à 5 questions.

Bien que cela fonctionne, je suis sûr qu'il ya une solution plus élégante. Si quelqu'un sait ce qui est que j'aimerais entendre.

Merci

Autres conseils

Jetez un oeil à la fonction MDX FILTER - cela peut vous donner ce que vous avez besoin. Une combinaison de filtres et propriétés membres pour filtrer contre les ID de pourrait le faire. Vous rencontrez un problème parce que ce que vous essayez de faire est un peu contre le grain de la façon dont un cube OLAP est structuré (de mon expérience) parce que l'âge et le sexe sont tous deux membres de la même dimension (réponses), ce qui signifie que ils reçoivent chacun leurs propres cellules pour l'agrégation, mais à la différence si âge et le sexe ont chacun leur propre dimension, ils ne sont pas agrégés par rapport à l'autre, sauf pour se totalisées. Dans un cube OLAP, chaque combinaison de chaque membre de chaque dimension à chaque membre de toute autre dimension obtient une « cellule » avec la valeur de chaque mesure qui est unique à cette combinaison - c'est-ce que vous voulez, mais les membres de la même dimension (tels que les réponses) ne sont pas contre-calculée de cette manière.

Si possible, je recommanderais casser les réponses individuelles dans des dimensions individuelles, à savoir l'âge et le sexe ont chacun leurs propres dimensions avec leurs propres membres, alors ce que vous voulez faire découlera naturellement de votre cube. Sinon, je crains que vous aurez beaucoup de MDX fiddelry à faire. (Je ne suis pas un expert MDX, cependant, pour que je puisse être complètement à côté de celui-ci, mais je crois savoir)

De plus, lisez certainement le livre mentionné précédemment, MDX Solutions, à moins que cela est la seule requête MDX vous pensez que vous aurez besoin d'écrire. MDX et l'analyse multidimensionnels sont rien comme SQL et une bonne compréhension de la structure d'une base de données OLAP et MDX en général est absolument essentiel, et ce livre fait un très, très bon travail de vous obtenir où vous besoin d'être dans ce département.

Lorsque vous essayez de trouver des problèmes avec où-critères ou des tranches je trouve utile de décomposer les éléments que vous trancher sur des dimensions, plutôt que des mesures.

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

Bien que vous n'êtes pas vraiment en utilisant la puissance de MDX -. Vous obtenez juste une valeur

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

vous donnera un tableau croisé dynamique (ou crosstable) décomposer le sexe (sur des colonnes) par âge-bandes (sur les lignes).

BTW - ff vous MDX ce livre d'apprentissage: MDX Solutions est de loin le meilleur point de départ que j'ai trouvé.

Si vous utilisez MSSQL, vous pouvez utiliser le « WITH ROLLUP » pour obtenir des lignes supplémentaires qui auraient les informations que vous souhaitez. , Vous n'utilisez pas « GROUP BY » dont vous aurez besoin aussi.

Utilisez le GROUP BY pour briser l'ensemble en groupes et ensuite utiliser des fonctions d'agrégation pour obtenir vos comptes et autres statistiques.

Exemple:

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

Cela vous donne le nombre de chaque sexe de la personne dans votre table dans chaque groupe d'âge, et le « Rollup » vous donnera le nombre total de personnes dans votre table, les numéros de chaque groupe d'âge quel que soit le sexe, et le nombre de chaque sexe, quel que soit l'âge. Quelque chose comme

AGE GENDER COUNT
--- ------ -----
 20      M  1245
 21      M  1012
 20      F   942
 21      F   838
         M  2257
         F  1780
 20         2187
 21         1850
            4037
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top