2009-07-30 9 views
3

J'ai un rapport qui suit la durée de certains éléments dans la base de données, et le fait en le suivant sur une série d'âges (20-44, 45-60 61-90, 91-180, 180+). J'ai la requête suivante comme source du rapport de données:Faire une requête Count() retourner 0 au lieu de vide

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'y a pas d'entrées d'une colonne. Au lieu de renvoyer un nombre de 0, une valeur vide est renvoyée.

Comment obtenir Count() pour retourner un 0 au lieu de vide?

+0

Peu importe ... un commentaire maintenant supprimé m'a donné la bonne idée ... –

+0

Nz fonctionne généralement bien avec Access: Nz (instruction, valeur if null) – Fionnuala

+0

Lorsque j'essaie votre requête d'origine, je reçois une erreur "Au plus un enregistrement peut être retourné par cette sous-requête" – BIBD

Répondre

0

Remplacer les déclarations Count avec

Sum(Iif(DateDiff("d",DateAdded,Date())>=91,Iif(DateDiff("d",DateAdded,Date())<=180,'1','0'),'0')) AS BTWN_91_180, 

Je ne suis pas fan des Iif imbriqués s, mais il ne semble pas comme il n'y a aucune façon autour d'eux, depuis DateDiff et BETWEEN...AND ne jouaient pas bien. Pour élaguer ItemName s sans aucune date ajoutée, le bloc de requête devait être inclus dans une requête plus grande, car la vérification par rapport à un champ calculé ne peut pas être effectuée à partir 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; 
+0

Pourquoi pas Nz(), c'est-à-dire un appel de fonction pour chaque colonne au lieu de deux? –

+0

'Nz' n'acceptera pas correctement la chaîne SQL, se plaignant d'un nombre incorrect d'arguments. –

9

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. Puisque je ne connais pas assez Access, je ne suis pas sûr que cela fonctionnera - pouvez-vous l'essayer? OK - content de voir qu'il y a quelque chose de similaire dans Access (si ce n'est pas exactement la même chose que dans SQL Server).

Marc

1

Mieux encore, utilisez Nz() par exemple

Nz(Count(SELECT Source.DateAdded 
      FROM Source 
      WHERE Int(Date()-Source.DateAdded), 0) 

Cela retournera 0 lorsque le résultat est nul, ou compte sinon.

Notez que la fonction Nz() fait partie du modèle d'objet Access et n'est donc disponible que lorsqu'elle est utilisée dans l'interface utilisateur 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 "Undefined function 'Nz' in expression".

+0

J'ai essayé cela avec cette ligne: 'Nz (Count (" SELECT Source.DateAdded FROM Source WHERE Int (Date() - Source.DateAdded) ENTRE 20 ET 44 "), 0) AS BTWN_20_44' (répété pour les autres tranches d'âge) , et chacun renvoie "1". –

+0

essayez de supprimer les guillemets ('"' s) autour de l'instruction select – BIBD

+0

La suppression des guillemets donne une erreur de" Nombre incorrect d'arguments utilisés avec la fonction dans l'expression de requête "". –

1

Sur seconde si (sans plus d'informations) Je pense que vous faites cette requête très mal ....

Comme je l'ai dit, lorsque je tente votre requête initiale je reçois une erreur « au plus un enregistrement peut être renvoyé par cette sous-requête ".

Ceci est probablement un peu plus 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; 

À moins que vous essayez d'obtenir un compte par nom de l'article ... dans ce cas, il est un peu trickyier.

+0

J'essaie d'obtenir un compte par nom d'article, dans ce cas, la dernière requête que j'ai posté fonctionne très bien, bien que je vais essayer votre version quand je retourne au travail le lundi. –

Questions connexes