[Access SQL] Count(*) ou Count([Nom_de_colonne]) ?

Tout le monde connaît l’opération d’agrégation SQL count permettant de compter le nombre d’occurrences renvoyées par une requête.

Dans le QBE d’Access, après avoir opéré le regroupement, on sélectionne l’opération Compte avec le champ de la table concerné.
Par exemple, si on souhaite connaître le nombre de commandes par client :

dont la traduction en SQL, nous donne l’opération :
…Count(Commandes.[N° commande]) AS [CompteDeN° commande]

Or on peut lire dans l’aide Access:

Count(*) s’exécute beaucoup plus rapidement que Count([nom_de_colonne])

Ce qui fait que l’on devrait plutôt utiliser le caractère générique *, et écrire quelque chose de normalement plus performant avec:

Soit en SQL,:
…Count(*) AS [CompteDeN° commande]

Notre requête présente toutefois l’inconvénient de ne pas présenter les clients qui n’ont jamais commandé. Pour tenter d’y remédier, on modifie dans un premier temps la requête avec une jointure externe LEFT (type « 2 » dans le QBE) :

qui retourne un résultat faux avec un nombre de commandes égal à 1 pour les clients qui n’ont jamais commandé. Cela est logique puisque le but de la jointure LEFT est justement de retourner au moins un enregistrement par client.

Pour s’en sortir il suffit de consulter l’aide à nouveau :

La fonction Count(expr) ne compte pas les enregistrements possédant des champs Null sauf si l’argument expr est remplacé par le caractère générique astérisque (*)

Si on écrit, la requête :

La requête retourne, pour les clients qui n’ont jamais commandé, un enregistrement avec [N° commande]=Null.

Il suffit de regrouper par client et de compter le nombre de champ [N° Commande] non à Null.

Il faut donc utiliser dans ce cas précis count([N°Commande]) et non count(*):

SELECT  
  Clients.[Code client], Clients.Société,
  Count(Commandes.[N° commande]) AS [CompteDeN° commande]
FROM Clients LEFT JOIN Commandes
    ON Clients.[Code client] = Commandes.[Code client]
GROUP BY Clients.[Code client], Clients.Société;

Conclusion :

Je reprends l’aide Access:

La fonction Count(expr) ne compte pas les enregistrements possédant des champs Null sauf si l’argument expr est remplacé par le caractère générique astérisque (*). Si vous utilisez un astérisque, la fonction Count calcule le nombre total des enregistrements, y compris ceux qui contiennent des champs Null.
Count(*) s’exécute beaucoup plus rapidement que Count([nom_de_colonne]).

Laisser un commentaire