Bonjour,
Je souhaite personnaliser la ligne de total dans un tableau croisé dynamique afin d'obtenir le résultat de l'image ci-dessous.
Comment faire ?
Bonjour,
Je souhaite personnaliser la ligne de total dans un tableau croisé dynamique afin d'obtenir le résultat de l'image ci-dessous.
Comment faire ?
Bonjour,
Dans un tableau droit, la fonction "dimensionality()" permet de savoir à quel niveau d’agrégation vous vous trouvez (0 = "total", 1 = "agrégé selon la première dim", ...).
Dans une tableau croisé, il y a en plus la fonction "secondarydimensionality()" qui permet de savoir à quel niveau vous êtes sur les dimensions horizontales.
Ainsi, une expression du type
affichera dans la ligne "total" le nombre de mois concernés par la colonne, tandis que les lignes afficheront la somme des valeurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if(Dimensionality() = 0, count(distinct Mois) , sum(Valeur) )
Bonjour,
En mettant le code ci-dessous, j'obtient bien le calcul désiré sur chaque ligne et le nombre 888 sur le total horizontal (tout en bas du tableau).
Je souhaite donc maintenant mettre à la place de ce 888, le count de toutes les valeurs de ligne qui sont supérieures à 0.25.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if( Dimensionality()=0 , 888 , (count(if(Dérogation = 'Avec Dérogation', 1)) + count(if(Statut = 'Refusé', 1))) / count(N°Echantillonage) )
Je fais donc le code ci-dessous mais plus rien ne s'affiche même sur les lignes.
Un conseil ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if( Dimensionality()=0 , count (if((count(if(Dérogation = 'Avec Dérogation', 1)) + count(if(Statut = 'Refusé', 1))) / count(N°Echantillonage) >= 0.25, 1)) , (count(if(Dérogation = 'Avec Dérogation', 1)) + count(if(Statut = 'Refusé', 1))) / count(N°Echantillonage) )
On ne peut pas faire de "count(if(count(...".
A chaque niveau, il faut agréger les données (fonction "aggr(expression, dim1, dim2, ...)")pour qu'il puisse savoir ce qu'il doit compter.
Il faudrait mettre quelque chose du genre
où "MaDimension" est la dimension utilisée dans le tableau.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 sum( aggr( if(sum(if(Dérogation = 'Avec Dérogation', 1)) + sum(if(Statut = 'Refusé', 1)) / count(N°Echantillonage) >= 0.25, 1) , MaDimension) )
Dans mon tableau, j'ai les dimensions suivantes : année, trimestre, mois, dépôt.
Chaque ligne correspond à un dépôt.
Je dois donc aggréger sur la dimension dépôt ?
Je fais ça mais ça ne fonctionne toujours pas :
Il affiche 0,0 sur le total horizontal en bas du tableau.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 if( Dimensionality()=0 , sum( aggr( if(sum(if(Dérogation = 'Avec Dérogation', 1)) + sum(if(Statut = 'Refusé', 1)) / count(N°Echantillonage) >= 0.25, 1) , depot) ) , (count(if(Dérogation = 'Avec Dérogation', 1)) + count(if(Statut = 'Refusé', 1))) / count(N°Echantillonage) )
J'ai aussi essayé d'aggréger selon les 4 dimensions en vain.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 if( Dimensionality()=0 , sum( aggr( if(sum(if(Dérogation = 'Avec Dérogation', 1)) + sum(if(Statut = 'Refusé', 1)) / count(N°Echantillonage) >= 0.25, 1) , Année, TrimDate, Mois_Ecrit_En_Entier, depot) ) , (count(if(Dérogation = 'Avec Dérogation', 1)) + count(if(Statut = 'Refusé', 1))) / count(N°Echantillonage) )
Avec les données suivantes :
en faisant un tableau croisé avec "depot" et "date", et l'expression
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 data: LOAD * INLINE [ date, depot, valeur 1, Aaa, 10 1, Aaa, 12 1, Bbb, 12 1, Ccc, 14 1, Ccc, 8 2, Aaa, 15 2, Bbb, 16 2, Bbb, 8 2, Ccc, 11 ];
j'obtiens bien le résultat attendu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if(Dimensionality() = 0, sum( aggr( if(sum(valeur) > 20, 1) , depot, date) ) , sum(valeur) )
Je vous invite à décomposer vos calculs pour vérifier ce que vous avez à chaque étape.
J'ai bien respecté votre synthaxe mais j'ai l'impression que votre tableau croisé dynamique ne se construit pas de la même manière que le mien.
En effet, vos dimensions depot et date sont sur la même ligne contrairement à mon tableau.
J'ai essayé de reproduire cette configuration pour essayer de comprendre, en vain.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 if( Dimensionality()=0 , sum( aggr( if(sum(if(Dérogation = 'Avec Dérogation', 1)) + sum(if(Statut = 'Refusé', 1)) / count(N°Echantillonage) >= 0.25, 1) , depot, Mois_Ecrit_En_Entier, TrimDate, Année ) ) , (count(if(Dérogation = 'Avec Dérogation', 1)) + count(if(Statut = 'Refusé', 1))) / count(N°Echantillonage) )
Si vous pouvez faire un mini jeu de données en "LOAD INLINE" avec uniquement les colonnes qui nous intéressent, ça serait plus simple pour vous aider.
Oui, j'aurais dû y penser dès le début.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 DATA: LOAD * INLINE [ annee, trimestre, mois, depot, taux 2017, 1, Janvier, depot1, 0.2 2017, 1, Janvier, depot2, 0.3 2017, 1, Janvier, depot3, 0.4 2017, 1, Janvier, depot4, 0.1 2017, 1, Janvier, depot5, 0.15 2017, 1, Janvier, depot6, 0.8 ];
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 if(Dimensionality() = 0, sum( aggr( if(sum(taux) > 0.2, 1) , depot, annee, trimestre, mois) ) , sum(taux) )
Je suis tout à fait d'accord avec vous mais lorsqu'on ajoute une expression ça ne fonctionne plus.
Qu'en pensez-vous ?
Quelle expression ?
Dans mon tableau j'ai plusieurs expressions et lorsqu'il y en a plus d'une, j'ai l'impression que le tableau change de présentation et notamment pour la disposition des dimensions.
Par exemple, si j'ajoute une expression et que je met à l'intérieur : =1 , le tableau change la disposition des dimensions et j'ai comme l'impression que c'est pour ça que ça ne fonctionne plus.
En effet, si vous regardez mes posts d'hier, j'ai bien respecté la même synthaxe que vous et pourtant j'ai toujours ce 0,0 d'affiché dans le total.
Tout dépend de comment vous placez vos expressions / dimensions.
Il est aussi possible qu'il y ait une erreur dans votre expression.
C'est pour cela qu'il faudrait que vous nous donniez un LOAD INLINE avec quelques données ainsi que l'expression qui ne fonctionne pas.
Je ne peux pas mettre en ligne un load des données réelles car ce serait considéré comme une fuite de données.
Je viens de faire un test avec une expression différente plus simple et ça fonctionne.
Le problème ne vient donc pas de la présence de plusieurs expressions et de leur positionnement mais comme vous l'avez dit, de mon expression.
Je ne comprends pas en quoi cette expression diffère de ce que nous avons fait dans l'exemple plus simple d'autant plus que j'obtient les bonnes valeurs sur les lignes, c'est simplement le total qui conserve la valeur 0,0.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 = if( Dimensionality()=0 , sum( aggr( // Ci-dessous je souhaite compter 1 à chaque fois que le morceau en rouge est >= 0.25. if((sum(if(Dérogation = 'Avec Dérogation', 1)) + sum(if(Statut = 'Refusé', 1))) / count(N°Echantillonage)) >= 0.25, 1) , depot, Année, TrimDate, Mois_Ecrit_En_Entier ) ) // Si je ne suis pas sur le total, je fais mon calcul normal : , (count(if(Dérogation = 'Avec Dérogation', 1)) + count(if(Statut = 'Refusé', 1))) / count(N°Echantillonage) )
L'expression est légèrement différente entre le total ("sum(if...") et l'expression de ligne ("count(if...".
Peut-être que cela vient de là...
J'ai retravaillé sur l'expression, toujours en vain.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 = if( Dimensionality()=0 , count( aggr( if((count(if(Dérogation = 'Avec Dérogation', 1)) + count(if(Statut = 'Refusé', 1))) / count(N°Echantillonage) >= 0.25, 1) , depot, Année, TrimDate, Mois_Ecrit_En_Entier ) ) , (count(if(Dérogation = 'Avec Dérogation', 1)) + count(if(Statut = 'Refusé', 1))) / count(N°Echantillonage) )
J'ai simplifié l'expression au maximum.
Dans la colonne [TEST], je mets les valeurs de la colonne [Taux Non Conformes] et au total je compte ceux >= 0.25.
Voici donc l'expression de [TEST] :
Le même problème est présent donc retour au point de départ, l'expression n'est pas responsable du problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 = if( Dimensionality()=0 , count( if([Taux Non Conformes] >= 0.25, 1) ) , [Taux Non Conformes] )
C'est un mystère complet.
Dans votre dernière expression, vous n'utilisez pas de fonction "aggr". Cela ne peut pas fonctionner.
Chose très étonnante, si je met un nombre à la place de l'expression pour le total, ça fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 = if( Dimensionality()=0 , 888 , [Taux Non Conformes] )
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager