[SSAS] DistinctCount sans les NULL et NullProcessing=Preserve

« NULL is the Chuck Norris of the database .
Nothing can be compared to it. »

Il arrive à tout consultant de se faire avoir par une fonctionnalité qu’il croyait tellement logique qu’il ne pensait pas qu’elle puisse être mal implémentée. Là en l’occurrence il s’agit du DistinctCount dans Analysis Services sur des colonnes potentiellement nulles.

Comptage des NULL en relationnel
Dans toute base SQL, un COUNT(MaColonne) ou les valeurs de MaColonne sont nulles ignore les NULL. Il en est de même pour les COUNT(DISTINCT MaColonne).
SELECT COUNT(DISTINCT MaColonne)
FROM
(
VALUES
(NULL),(1)
)
T(MaColonne)
Vous pouvez tester avec ceci qui renverra invariablement « 1 »
Comptage en MDX
Passons à Analysis Services. Dans la même logique en MDX, tout fonctionne exactement de la même manière. Si vous tapez:
WITH
MEMBER CountOfT
AS
DistinctCount
(
{
[Time].[Year].&[2011]
, Null
}
)

SELECT CountOfT ON 0
FROM [Cube]
Vous obtiendrez le même résultat que précédemment à savoir 1.
Comptage des NULL en agrégation DistinctCount

En revanche si vous créez une mesure (et donc un groupe de mesure dédié) en DistinctCount sur une colonne potentiellement nulle, vous constaterez que… les NULL sont comptés. Bien sûr auparavant vous aurez pris soin de passer le NullProcessing en Preserve sur la mesure pour que les NULL ne soient pas convertis en 0 par SSAS (le comportement par défaut revient à ZeroOrBlank: les convertir en zéro ou chaine vide selon le type de la mesure.)
D’après Charles Wang dans ce post il s’agit a priori d’un bug de SSAS.
La seule solution – comme dit par Deepak Puri dans le post cité au dessus – revient donc à appuyer le groupe de mesure dédié du DistinctCount sur une Named Query qui filtre les NULL sur la table d’origine et non sur cette dernière directement.
Si vous avez d’autres solutions, n’hésitez pas. Et moi maintenant je teste avant de m’avancer🙂

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s