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)?

Était-ce utile?

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".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top