2014-07-14 1 views
0

Je commence à utiliser SSAS et j'essaie de produire un cube de données qui me permet de produire un graphique du nombre de personnes dans une tranche d'âge donnée par trimestre couvrant un certain nombre des années. Ainsi, par exemple:Graphique basé sur la période avec des blocs d'âge utilisant SSAS

    | $  @$   $ 
Number of people | # $  @$   #@$ 
       | #@$  #@$   #@$ 
       +------------------------------ 
        2010 Q1 2010 Q2 ... 2014 Q1 

où # sont des gens âgés de 10 à 20, @ sont les personnes âgées de 20 à 30 et $ sont les personnes âgées de 30-40. Le problème que je découvre est qu'en 2010 quelqu'un aurait pu avoir 29 ans et tomberait dans la tranche d'âge 20-30 ans, mais en 2014 je veux que cette même personne soit comptée dans la tranche d'âge 30-40 parce que il serait maintenant 33. Je ne sais pas comment (ou s'il est même possible de) créer une dimension qui serait sensible à la date et au temps?

+0

Comment obtenez-vous l'information sur l'âge? Avez-vous une dimension de personne contenant un anniversaire ou (en assumant des problèmes de confidentialité) une année de naissance à partir de laquelle vous pouvez calculer l'âge (estimé) à une certaine date? – FrankPl

+0

Salut, oui, j'ai une date de naissance avec laquelle calculer. – Anupheaus

Répondre

0

Construire dans votre modèle

modélisent Juste correctement: En supposant que vous avez une table de faits contenant les mesures que vous analysez et les clés étrangères à une dimension de personne ainsi qu'une dimension de date, ajouter une nouvelle table pour la dimension "groupe d'âge" contenant les plages que vous souhaitez analyser. Cette table contiendrait e. g. un enregistrement "0-9", un "10-19", etc.

Puis ajoutez une colonne de clé étrangère référençant la dimension de groupe d'âge à la table de faits. Définir la valeur de cette clé étrangère serait alors une instruction de mise à jour SQL sur la table de faits qui calcule la différence entre la date référencée par la clé étrangère à la dimension date et la date de naissance de la personne référencée par la clé étrangère à la dimension personne . Cette différence est l'âge à cette date. À partir de là, déterminez le groupe d'âge et utilisez sa clé primaire comme valeur de la colonne de clé étrangère. Et enfin, créez simplement un attribut à partir de la colonne de votre groupe d'âge de la dimension du groupe d'âge.

Calculer à la volée

Si vous voulez vraiment calculer que à la volée, je ne suis pas sûr de la performance est bonne, mais vous pouvez l'essayer comme suit: Vous auriez besoin de « l'âge groupe "dimension aussi bien. Mais il n'y aurait pas besoin de le lier à votre table de faits. Ensuite, définir un membre calculé comme suit:

member [Measures].[Age at Date] AS 
     DateDiff('yyyy', 
       [Person].[BirthDate].CurrentMember.Properties("Key0", TYPED), 
       Measures.[Date] 
       ) 
Member [Measures].[Person Count per Age Group] AS 
     CASE 
      WHEN [Age Group].[Age Group].CurrentMember is [Age Group].[Age Group].[0-9] THEN 
       Filter([Person].[Person Id].[Person Id].Members, 
         [Measures].[Age at Date] >= 0 AND [Measures].[Age at Date] < 10 
        ).Count 
      WHEN [Age Group].[Age Group].CurrentMember is [Age Group].[Age Group].[10-19] THEN 
       Filter([Person].[Person Id].[Person Id].Members, 
         [Measures].[Age at Date] >= 10 AND [Measures].[Age at Date] < 20 
        ).Count 
      ... 
     END 

Cela suppose que vous avez la date de chaque enregistrement dans une mesure nommée Measures.[Date] directement dans votre table de faits. Si ce n'est pas le cas, vous pouvez obtenir cette date en tant que type de données de date, éventuellement à partir du membre actuel de la dimension de date, de la même manière que la date de naissance est dérivée via la propriété Key0. Je suppose que vous utilisez vraiment un type de données Date dans la dimension de la clé d'attribut date de naissance, sinon, une conversion de type peut être nécessaire. À des fins comme cela, il existe de nombreuses fonctions VBA disponibles dans Analysis Services (comme le DateDiff que j'ai utilisé ci-dessus), comme documented here.

+0

J'espérais que SSAS le ferait à la volée plutôt que de produire les données dans une très, très grande table de faits. Le problème est qu'il y a beaucoup d'employés et des années de données valables. Cette table de faits serait énorme! – Anupheaus

+0

@Anupheaus Je ne pense pas que vous avez besoin d'une trop grande augmentation de la taille de la table. Comme vous avez sûrement moins de 255 groupes d'âge, vous pouvez utiliser une colonne de clé primaire et étrangère de type tinyint.Et même pour les grandes entreprises, je suppose que vous avez moins d'un million d'employés. Donc, pour 50 ans de données, vous auriez 200 trimestres, 1 million, vous obtenez 200 mégaoctets (plus certains frais généraux en fonction des détails de stockage). Même si vous utilisiez int au lieu de tinyint, vous auriez une augmentation de quatre fois 200 Mo, je. e. environ 1 Go, ce que je ne suppose pas énorme. – FrankPl

+0

Je dois être capable de forer des mois. En fin de compte, si le SSAS ne peut pas le faire avec un calcul calculé, alors je marquerai ceci comme la réponse (puisqu'il ne peut pas être fait autrement) à moins que vous connaissiez un calcul qui pourrait permettre à SSAS de le faire à la volée? – Anupheaus

Questions connexes