Machen Sie eine Abfrage Count () return 0 statt leerer
-
05-07-2019 - |
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?
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 Iif
s, 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 ItemName
s 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“.