2017-06-13 2 views
1

J'ai un cube exemple simplifié utilisé à des fins d'apprentissage, et pour essayer de résoudre un problème plus complexe.MDX/SSAS somme de certaines valeurs sur les totaux - calculer le taux de réussite/échec

Le cube représente un petit journal de serveur web,

  • nombre de hits comme un nom d'hôte mesure
  • comme une dimension
  • http code d'état comme une dimension

Je peux obtenir une ventilation du nombre de visites par hôte et du code d'état http avec le MDX

SELECT NON EMPTY { [Measures].[CNT HITS] } ON COLUMNS, 
     NON EMPTY { ([DIM NOS STATUSCODE].[Statuscode].[Statuscode].ALLMEMBERS * 
        [DIM NOS HOST].[HOST].[HOST].ALLMEMBERS) } ON ROWS 
FROM [DW] 

enter image description here

Maintenant, ce que je voudrais faire est de faire des groupes sur divers codes d'état HTTP par ex. indique le pourcentage de succès (tous les codes d'état 2xx), le pourcentage de succès infructueux (tous les codes d'état non 2xx).

Je peux le faire avec SQL, mais je ne sais pas comment le faire avec MDX. par exemple. avec SQL que je ferais:

select HOST, 
     sum(CNT_HITS) as HITS , 
     SUM(CASE WHEN s.statuscode div 100 = 2 THEN CNT_HITS ELSE 0 END)/sum(CNT_HITS) * 100 as success_percent, 
     SUM(CASE WHEN s.statuscode div 100 = 2 THEN 0 ELSE CNT_HITS END)/sum(CNT_HITS) * 100 as failed_percent, 
     sum(CASE WHEN s.statuscode = 401 THEN CNT_HITS ELSE 0 END)/sum(CNT_HITS) * 100 as auth_fail_percent 
     from FACT_NOS_HTTPLOG fact 
group by HOST; 

Et pour les données indiquées dans la capture d'écran ci-dessus, je me faisais

+-----------------+------+-----------------+----------------+-------------------+ 
| HOST   | HITS | success_percent | failed_percent | auth_fail_percent | 
+-----------------+------+-----------------+----------------+-------------------+ 
| www.example.com | 1610 |   93.1677 |   6.8323 |   6.2112 | 
| www.test.com | 50 |   0.0000 |  100.0000 |   0.0000 | 
+-----------------+------+-----------------+----------------+-------------------+ 

Mais comment puis-je accomplir cela avec MDX?

Répondre

1

Je pense que la manière la plus simple d'y parvenir est d'ajouter une colonne à votre table de faits (ou vue/requête) qui contiendrait des clés pour success_percent, failed_percent ou auth_fail_percent. Créez ensuite une nouvelle dimension avec ces 3 membres. Joignez-vous au fait et vous avez votre solution sans avoir besoin de MDX du tout.

+0

Pouvez-vous avec quelques détails, je ne suis pas en mesure de comprendre ce que je devrais faire - même si elle sonne comme une solution pas si souple .- Et si demain, je veux un autre groupe basé sur un autre statut http gamme ? Aussi - que voulez-vous dire sans aucun mdx du tout? Sinon, comment puis-je obtenir les données de SSAS? – binary01

+0

@ binary01 (augmenté) cette solution sera la plus efficace – whytheq

+0

@ binary01 si vous avez encore besoin de plus de détails faites le moi savoir. –

1

Ajouter un attribut supplémentaire [Etat] à votre [DIM NOS statusCode] dimension et utiliser MDX pour le pourcentage, comme ceci:

([DIM NOS STATUSCODE].[Status].&[Failed],[Measures].[CNT HITS])/[Measures].[CNT HITS] 
+0

Merci - ma tentative est devenue [this] (http://i.imgur.com/ahix432.png), ce qui semble donner les pourcentages corrects. Cependant, si j'inclue aussi les dimensions '[statuscode]', les pourcentages deviennent simplement absurdes, comme montré [ici] (http://i.imgur.com/37gZrnT.png) - Je m'attendrais à ce que ce cas montre soit null/0 ou 100% de taux de réussite pour les codes d'état respectifs. , Je m'inquiète qu'il y ait plus de cas qui peuvent produire de mauvais résultats. – binary01

+0

Remplacer ([CODE ÉTAT NOS DIM]. [SUCCÈS]. & [SUCCÈS], [Mesures]. [CNT HITS]) avec [Mesures]. [CNT HITS SUCCESS] en ajoutant le champ comme mesure supplémentaire: CASE WHEN s.statuscode div 100 = 2 ALT CNT_HITS ELSE NULL END –

+0

Ok - cela semble fonctionner. Mais il semble très peu flexible ... La structure du cube doit être modifiée et retraitée si une nouvelle catégorie de codes d'état est nécessaire ...alors qu'avec une solution SQL pure, il s'agit juste de modifier le SQL. – binary01

0

Il impliquera une certaine quantité de codage en dur - bien que vous pouvez les ajouter mesures dans votre script de cube.

WITH 
    MEMBER [Measures].[failed_percent] AS 
    DIVIDE(
     (
      [DIM NOS STATUSCODE].[Status].&[Failed] 
     ,[DIM NOS HOST].[HOST].currentmember 
     ,[Measures].[CNT HITS] 
     ) 
     , (
      [DIM NOS STATUSCODE].[Status].[All] 
     ,[DIM NOS HOST].[HOST].currentmember 
     ,[Measures].[CNT HITS] 
     ) 
    ) 
SELECT 
NON EMPTY 
    { 
    [Measures].[CNT HITS] 
    ,[Measures].[failed_percent] 
    } ON COLUMNS, 
NON EMPTY 
    [DIM NOS HOST].[HOST].[HOST].ALLMEMBERS 
    ON ROWS 
FROM [DW];