Mélange d’indicateurs agrégés et non agrégés

L’autre jour je suis tombé sur un problème de comptage dans BO.
L’univers contenait des indicateurs agrégés et non agrégés sur la même table.
Certains indicateurs étaient agrégés pour question de performance, et d’autres ne l’étaient pas pour pouvoir les mettre en condition sans que BO ne les agrège.
Problème, si on prend les 2 types d’indicateurs dans la même requête, un groupement par l’indicateur non agrégé se fait :(

Un exemple sera plus parlant :
On a une table VENTES

VENTES
client  montant
TOTO    120
TOTO    100
TITI    80
TITI    80


et 2 indicateurs :

montant vente=montant
nombre clients=count(distinct client)

la requête suivante est bonne :

client, montant
TOTO   220
TITI   160
somme  380

Ainsi que :

nombre clients
2

Mais si on prend les 2 indicateurs les résultats sont faux :

nombre clients, montant
2      300

car on a en SQL

select  
  count(distinct VENTES.client),  
  VENTES.montant
from VENTES
group by VENTES.montant

Comme quoi il faut être vigilant sur les normes mises en oeuvre sur un univers, et garder les mêmes règles pour tout indicateur. Si on utilise les fonctions d’agrégation sur un indicateur ( et cela inclut le count() ), il faut faire de même sur les autres.

2 réflexions au sujet de « Mélange d’indicateurs agrégés et non agrégés »

  1. Oui, on n’a pas ce problème si on a la somme dans le SQL de l’objet (c’est ce que je sous-entends à la fin). Mais des fois on ne met pas de somme dans les indicateurs, notamment pour éviter les problèmes d’agrégation dans les conditions.
    Par exemple avec une somme dans le SQL si tu veux avoir les clients ayant eu une vente supérieure à 150€ tu mettrais juste en condition « Montant>150″ et tu récupérerais TOTO et TITI, car la somme des montants est supérieur à 150€. Soit un résultat faux. Il faudrait rajouter des objets dans la requête, ce qui n’est pas évident pour un utilisateur lambda en conviendras-tu.
    Dans l’article j’avais pris le cas d’un univers où aucun indicateur n’était sommé (pour pouvoir les mettre en condition facilement) et où on trouvait des indicateurs « Nombre de » qui utilisaient la fonction count().

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>