Crea una query Count () restituisce 0 invece di vuoto
-
05-07-2019 - |
Domanda
Ho un rapporto che traccia da quanto tempo alcuni elementi sono stati nel database e lo fa rintracciandolo su una serie di fasce di età (20-44, 45-60, 61-90, 91-180, 180+ ). Ho la seguente query come origine dati del rapporto:
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;
Questa query funziona alla grande, tranne se non ci sono voci in una colonna. Invece di restituire un conteggio di 0, viene restituito un valore vuoto.
Come posso ottenere Count () per restituire uno 0 anziché vuoto?
Soluzione 4
Sostituisci le istruzioni Count
con
Sum(Iif(DateDiff("d",DateAdded,Date())>=91,Iif(DateDiff("d",DateAdded,Date())<=180,'1','0'),'0')) AS BTWN_91_180,
Non sono un fan dei Iif
nidificati, ma non sembra che ci sia alcun modo per aggirarli, dal momento che DateDiff
e TRA. ..AND
non stavano giocando bene.
Per potare ItemName
senza alcuna data aggiunta, il blocco di query doveva essere racchiuso in una query più grande, poiché il controllo su un campo calcolato non può essere eseguito all'interno di una query. Il risultato finale è questa query:
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;
Altri suggerimenti
Puoi tornare
ISNULL(Count(......), 0)
e tutto dovrebbe andare bene - sarebbe in MS SQL Server - ma ho appena visto che stai usando Access. Dal momento che non conosco abbastanza l'accesso, non sono sicuro che funzionerà - puoi provarlo?
OK - sono contento di vedere che c'è qualcosa di simile in Access (se non esattamente lo stesso di SQL Server).
Marc
Al secondo (senza ulteriori informazioni) penso che tu stia facendo questa query molto male ....
Come ho detto, quando provo la tua query originale ricevo un errore " Al massimo un record può essere restituito da questa subquery " ;.
Questo è probabilmente un po 'più vicino a quello che vuoi
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;
A meno che tu non stia provando a ottenere un conteggio per Nome oggetto ... nel qual caso è un po 'più complicato.
Ancora meglio, usa Nz ()
ad es.
Nz(Count(SELECT Source.DateAdded
FROM Source
WHERE Int(Date()-Source.DateAdded), 0)
Questo restituirà 0 quando il risultato è null, o conta altrimenti.
Notare che la funzione Nz ()
fa parte del modello a oggetti di Access e pertanto è disponibile solo se utilizzata nell'interfaccia utente di Access. Se stai utilizzando il motore di database di Access senza l'interfaccia utente di Access (da un'altra applicazione tramite OLE DB, ODBC, ecc.), Visualizzerai un errore, " Funzione indefinita 'Nz' nell'espressione " ;.