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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top