Frage

Ich habe einen Bericht, die nachvollzieht, wie lange bestimmte Elemente in der Datenbank waren, und tut dies, indem es über eine Reihe von Altersgruppen Tracking (20-44, 45-60, 61-90, 91-180, 180+ ). Ich habe die folgende Abfrage als Datenquelle des Berichts:

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;

Diese Abfrage funktioniert gut, es sei denn, es gibt keine Einträge eine Spalte. Statt eine Zählung von 0 zurückzukehren, ein leerer Wert zurückgegeben wird.

Wie werde ich Count () ein 0 statt leer zurück?

War es hilfreich?

Lösung 4

Ersetzen Sie die Count Aussagen mit

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

Ich bin kein Fan des verschachtelten Iifs, aber es sieht nicht so aus jeder Art und Weise gibt es um sich herum, da DateDiff und BETWEEN...AND waren nicht schön spielen.

Um ItemNames ohne Zusatz Daten zu beschneiden, hatte der Abfrageblock in einer größeren Abfrage eingeschlossen werden, da gegen ein berechnetes Feld Überprüfung kann nicht aus dem Innern einer Abfrage durchgeführt werden. Das Endergebnis ist diese Abfrage:

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;

Andere Tipps

Sie können zurückkehren

ISNULL(Count(......), 0)

und alle sollten in Ordnung sein - in MS SQL Server sein würde - aber ich sah nur Zugang Sie verwenden. Da ich nicht Zugang genug weiß, ich bin nicht sicher, dass dies funktionieren wird - können Sie es versuchen

?

OK - froh zu sehen, gibt es etwas ähnliches in Access (wenn nicht genau den gleichen wie in SQL Server).

Marc

Auf den zweiten aber (ohne weitere Informationen) Ich denke, dass Sie diese Abfrage tun, sehr falsch ....

Wie gesagt, wenn ich Ihre ursprüngliche Abfrage versuchen, bekomme ich einen Fehler „Höchstens einen Datensatz kann durch diese Unterabfrage zurückgegeben werden“.

Dies ist wahrscheinlich ein wenig näher an, was Sie wollen

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;

Wenn Sie versuchen, eine Zählung pro Einzelteilnamen zu bekommen ... in diesem Fall ist es ein wenig trickyier.

Noch besser ist, verwenden Nz() z.B.

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

Dies wird 0 zurück, wenn das Ergebnis Null ist oder auf andere Weise zählen.

Beachten Sie die Nz() Funktion Teil des Access-Objektmodell ist und daher nur zur Verfügung, wenn in der Access-Benutzeroberfläche verwendet. Wenn Sie die Access-Datenbank-Engine ohne die Access-Benutzeroberfläche verwenden (aus einer anderen Anwendung über OLE DB, ODBC, etc), dann wird eine Fehlermeldung angezeigt: „Nicht definierte Funktion‚Nz‘in Ausdruck“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top