2017-06-29 2 views
0

J'écris MDX pour joindre une dimension à lui-même basé sur deux périodes différentes pour obtenir une liste commune, puis faire un compte contre cette liste pour les deux.MDX rejoindre avec la même dimension

En bref, je dois

  • obtenir une liste des années Student.UniqueId pour Période1 qui a un drapeau (IsValid) qui est défini qui n'est pas réglé dans les données Période2
  • obtenir un plein liste des étudiants pour Period2
  • joindre les deux listes et produire deux enregistrements (une pour chaque période) avec le même nombre (ces comptes seront utilisés pour le calcul des membres calculés dans chaque période)

Je l'ai essayé de le faire via subselect et existe clause avec filtre

SELECT 
{ 
    [Measures].[FactStudentCount] 
} on COLUMNS, 
{ NONEMPTY 
    (
     [TestEvent].[TestEvents].[Name].ALLMEMBERS 
     * [TestEvent].[PeriodName].[PeriodName].ALLMEMBERS 
    )        
} ON ROWS 
FROM (SELECT ({ 
    exists 
    (
     filter([Student].[UniqueId].[UniqueId].MEMBERS 
      ,([TestEvent].[Key].&[Period1], [IsValid].[Code].&[Yes])) 
     , 
     filter([Student].[UniqueId].[UniqueId].MEMBERS 
      ,[TestEvent].[Key].&[Period2]) 
    ) 
    }) ON COLUMNS 
FROM [MyCube]) 

... mais cela ne donne pas le résultat correct

(Pour obtenir contexte) J'ai aussi essayé similaire existe/filtre dans un où la clause

SELECT 
{ 
    [Measures].[FactStudentCount] 
} on COLUMNS, 
{ NONEMPTY 
    (
     [TestEvent].[TestEvents].[Name].ALLMEMBERS 
     * [TestEvent].[PeriodName].[PeriodName].ALLMEMBERS 
    )        
} ON ROWS 
FROM [MyCube] 
where (
    exists 
    (
     filter([Student].[UniqueId].[UniqueId].MEMBERS 
      ,([TestEvent].[Key].&[Period1], [IsValid].[Code].&[Yes])) 
     , 
     filter([Student].[UniqueId].[UniqueId].MEMBERS 
      ,[TestEvent].[Key].&[Period2]) 
    ) 
) 

... mais encore une fois cela ne produit pas le résultat correct

J'ai essayé les peaufinage instructions de filtre (au existe) à s comme lya quelque chose

(filter(existing([Student].[UniqueId].[UniqueId].allmembers),[TestEvent].[Key].CurrentMember.MemberValue = 'Period1'), [IsValid].[Code].&[Yes]) 
, 
(filter(existing([Student].[UniqueId].[UniqueId].allmembers),[TestEvent].[Key].CurrentMember.MemberValue = 'Period2')) 

... Cependant, cela ne renvoie une ligne (pour Période1) - qui a dit qu'il est le total

correcte J'ai aussi essayé par un CrossJoin mais avec NonEmpty échoue parce que les champs viennent de la même hiérarchie - le message « la hiérarchie clé est utilisée plus d'une fois dans la fonction Crossjoin »

est-ce que quelqu'un a aucune indication sur la façon de résoudre le scénario ci-dessus?

Répondre

0

C'est ce que je l'ai fait

NonEmpty(
    NonEmpty(
     {([Student].[UniqueId].[UniqueId].members)},{([TestEvent].[Key].&[Period1], [IsValid].[Code].&[Yes])} 
    ) 
    , 
    {([Student].[UniqueId].[UniqueId].members,[TestEvent].[Key].&[Period2])} 
) 

Cela obtient tous les éléments Période1, avec IsValid = « Oui » puis « se joint à gauche » avec des enregistrements dans ce Period2