Effectuer une requête Count () renvoie 0 au lieu de vide
-
05-07-2019 - |
Question
J'ai un rapport qui mesure la durée de conservation de certains éléments dans la base de données sur plusieurs tranches d'âge (20-44, 45-60, 61-90, 91-180, 180+). ). J'ai la requête suivante comme source de données du rapport:
SELECT DISTINCT Source.ItemName,
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) > 20) AS Total,
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) BETWEEN 20 AND 44) AS BTWN_20_44,
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) BETWEEN 45 AND 60) AS BTWN_45_60,
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) BETWEEN 61 AND 90) AS BTWN_61_90,
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) BETWEEN 91 AND 180) AS BTWN_91_180,
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) > 180) AS GT_180
FROM Source
GROUP BY Source.ItemName;
Cette requête fonctionne très bien, sauf s’il n’ya pas d’entrée de colonne. Au lieu de renvoyer un nombre de 0, une valeur vide est renvoyée.
Comment puis-je obtenir que Count () renvoie 0 (au lieu de vide)?
La solution 4
Remplacez les instructions Count
par
Sum(Iif(DateDiff("d",DateAdded,Date())>=91,Iif(DateDiff("d",DateAdded,Date())<=180,'1','0'),'0')) AS BTWN_91_180,
Je ne suis pas un fan des Iif
imbriqués, mais cela ne semble pas être une solution, car DateDiff
et BETWEEN. ..AND
ne jouaient pas bien.
Pour supprimer les éléments ItemName
sans aucune date ajoutée, le bloc de requête doit être placé dans une requête plus grande, car la vérification par rapport à un champ calculé ne peut pas être effectuée à l'intérieur d'une requête. Le résultat final est cette requête:
SELECT *
FROM
(
SELECT DISTINCT Source.ItemName AS InvestmentManager,
Sum(Iif(DateDiff("d",DateAdded,Date())>=20,Iif(DateDiff("d",DateAdded,Date())<=44,'1','0'),'0')) AS BTWN_20_44,
Sum(Iif(DateDiff("d",DateAdded,Date())>=45,Iif(DateDiff("d",DateAdded,Date())<=60,'1','0'),'0')) AS BTWN_45_60,
Sum(Iif(DateDiff("d",DateAdded,Date())>=61,Iif(DateDiff("d",DateAdded,Date())<=90,'1','0'),'0')) AS BTWN_61_90,
Sum(Iif(DateDiff("d",DateAdded,Date())>=91,Iif(DateDiff("d",DateAdded,Date())<=180,'1','0'),'0')) AS BTWN_91_180,
Sum(Iif(DateDiff("d",DateAdded,Date())>180,'1','0')) AS GT_180,
Sum(Iif(DateDiff("d",DateAdded,Date())>=20,'1','0')) AS Total
FROM Source
WHERE CompleteState='FAILED'
GROUP BY ItemName
)
WHERE Total > 0;
Autres conseils
Vous pouvez retourner
ISNULL(Count(......), 0)
et tout devrait bien se passer - serait dans MS SQL Server - mais je viens de voir que vous utilisez Access. Étant donné que je ne connais pas assez l'accès, je ne suis pas sûr que cela fonctionnera. Pouvez-vous l'essayer?
OK - content de voir quelque chose de similaire dans Access (si ce n'est pas exactement pareil que dans SQL Server).
Marc
La seconde cependant (sans plus d'informations), je pense que vous faites cette requête très mal ....
Comme je l'ai dit, lorsque j'essaie de répondre à votre requête d'origine, le message d'erreur suivant s'affiche: "Un seul enregistrement peut être renvoyé par cette sous-requête".
C’est probablement un peu plus près de ce que vous voulez
SELECT DISTINCT Source.ItemName,
(SELECT count(Source.DateAdded ) FROM Source
WHERE Int(Date()-Source.DateAdded)> 20) AS Total,
(SELECT count(Source.DateAdded ) FROM Source
WHERE Int(Date()-Source.DateAdded) BETWEEN 20 AND 44) AS BTWN_20_44,
(SELECT count(Source.DateAdded ) FROM Source
WHERE Int(Date()-Source.DateAdded) BETWEEN 45 AND 60) AS BTWN_45_60,
(SELECT count(Source.DateAdded ) FROM Source
WHERE Int(Date()-Source.DateAdded) BETWEEN 61 AND 90) AS BTWN_61_90,
(SELECT count(Source.DateAdded ) FROM Source
WHERE Int(Date()-Source.DateAdded) BETWEEN 91 AND 180) AS BTWN_91_180,
(SELECT count(Source.DateAdded ) FROM Source
WHERE Int(Date()-Source.DateAdded) > 180) AS GT_180
FROM Source
GROUP BY Source.ItemName;
Sauf si vous essayez d'obtenir un nombre par nom d'élément ... Dans ce cas, c'est un peu plus compliqué.
Encore mieux, utilisez Nz ()
par exemple.
Nz(Count(SELECT Source.DateAdded
FROM Source
WHERE Int(Date()-Source.DateAdded), 0)
Ceci renverra 0 lorsque le résultat sera nul ou comptera sinon.
Notez que la fonction Nz ()
fait partie du modèle d'objet Access et n'est donc disponible que si elle est utilisée dans l'interface utilisateur d'Access. Si vous utilisez le moteur de base de données Access sans l'interface utilisateur Access (à partir d'une autre application via OLE DB, ODBC, etc.), vous obtiendrez une erreur, "Fonction non définie 'Nz' dans l'expression".