2017-06-28 3 views
5

Je dois calculer un regroupement de mesures par date dans une plage de dates en tenant compte des dates de début et de fin d'une dimension. L'objectif est de compter le nombre d'élèves d'une école spécifique actifs chaque jour d'une période.MDX - Comment regrouper par date en tenant compte des dates de début et de fin dans une dimension

Le code SQL suivant fonctionne sur Data Warehouse (source de cube).

SELECT 
    t.[date] 
    ,count(distinct a.SKStudent) as Students 
FROM DM.DimTime t 
    CROSS JOIN DM.FactStudents a 
    INNER JOIN DM.DimStudents m ON a.SKStudent = m.SKStudent 
    INNER JOIN DM.DimSchool e ON a.SKSchool = e.SKSchool 
WHERE t.[date] between '20170502' and '20170512' 
    and e.SchoolCode = 123456 
    and t.[date] between m.[StartDate] and m.[EndtDate] 
GROUP BY t.[data] 

Le jeu de résultats est comme ce qui suit:

+--------------+----------+ 
| date   | Students | 
+--------------+----------+ 
| 2017-05-02 | 567 | 
| 2017-05-03 | 567 | 
| 2017-05-04 | 568 | 
| 2017-05-05 | 570 | 
| 2017-05-06 | 570 | 
| 2017-05-07 | 570 | 
| 2017-05-08 | 573 | 
| 2017-05-09 | 573 | 
| 2017-05-10 | 571 | 
| 2017-05-11 | 568 | 
| 2017-05-12 | 568 | 
+--------------+----------+ 

J'essaie de fait le code MDX. Ce qui suit est ce que j'ai essayé. Je ne sais pas comment filtrer le jour en utilisant la logique dans l'instruction CASE (entre « ??? » marques):

WITH SET DateRange AS 
    [Dim Time].[Date].&[20170502]:[Dim Time].[Date].&[20170512] 
MEMBER StudentsByDay AS 
    AGGREGATE(DateRange, 
     ???CASE WHEN DateRange.CURRENTMEMBER 
        BETWEEN [Dim Students].[Start Date] 
         AND [Dim Students].[End Date] 
       THEN [Measures].[Students Count] 
      ELSE NULL END???) 
SELECT 
    NON EMPTY { [StudentsByDay] } ON COLUMNS, 
    NON EMPTY { [DateRange] } ON ROWS 
FROM [Education] 
WHERE ([Dim School].[School Code].&[123456]) 

Répondre

2

MDX est pas flexible comme SQL. Je vous recommande de mettre la condition suivante dans votre table FactStudents:

t.[date] between m.[StartDate] and m.[EndtDate] 

et utilise comme une mesure distincte ou remplacer l'existant.

Vous avez besoin des choses suivantes:

  1. une table de fait avec DateID, champs StudentID (voir le code ci-dessous);
  2. un groupe de mesures associé aux variables Student et Date;
  3. une mesure avec l'agrégation DistinctCount sur le champ StudentID.

Le code fait:

SELECT 
    t.[date] as DateID 
    ,a.[SKStudent] as StudentID 
FROM DM.DimTime t 
    CROSS JOIN DM.FactStudents a 
    INNER JOIN DM.DimStudents m ON a.SKStudent = m.SKStudent 
    INNER JOIN DM.DimSchool e ON a.SKSchool = e.SKSchool 
WHERE e.SchoolCode = 123456 
    and t.[date] between m.[StartDate] and m.[EndtDate] 
+0

Je ne peux pas comprendre comment appliquer cela. Ma date (t.date) est inconnue. Il est informé en cours d'exécution. Voulez-vous dire construire un nouveau fait agrégeant FactStudents par DimTime? –

+0

J'ai pointé les étapes ci-dessus. –

+0

Je comprends maintenant. Je suis juste effrayé par la quantité de lignes dans ce fait pour notre réalité: 1,3M Étudiants * 365 jours (en moyenne). –