2013-10-07 13 views
7

Buon giorno tutti qui è il mio codiceConte Tornando vuota invece di 0

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.fld_LOAN)) as [Month] 
    ,COUNT(PIT.fld_ID)'COUNT' 
    ,SUM (PIT.fld_GRAM)'GRAMS' 
    ,SUM (PH.fld_AMNT)'PRINCIPAL' 
FROM #AllExpired AE 
    INNER JOIN Transactions.tbl_ITEM PIT 
    ON AE.fld_MAINID=PIT.fld_MAINID 
    INNER JOIN Transactions.tbl_HISTO PH 
    ON AE.fld_MAINID =PH.fld_MAINID 
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.fld_LOAN))) 

il problema che sto affrontando è che il mio conte funzione non restituire 0 se non ha valori, Somma funzione non restituisce NULL se non sono stati recuperati i valori risultanti, ma viene emesso solo vuoto, perché è così? e come posso risolverlo?

ecco un colpo di schermo output di esempio

A

naturalmente questo non è che voglio lo voglio uscita zero e nulli. per favore aiutami non so che cosa non va. grazie.

+2

Quale valore ti aspetteresti di visualizzare nella colonna 'Mese' - SQL Server deve semplicemente creare un valore magico per lì? –

+1

Ma quando ci sono * non * righe da elaborare - la condizione in cui il risultato desiderato è 0 - da che cosa verrà calcolato? –

+0

ohhh ora capisco, capisco :) grazie @Damien_The_Unbeliever che mi hai aiutato in questo momento :) – user2705620

risposta

10

Non si può pretendere nessun record da emessi quando si utilizza un Clausola GROUP BY, quando non ci sono record nella tua fonte.

Se si desidera un'uscita pari a 0 dalle funzioni SUM e COUNT, non utilizzare GROUP BY.

Il motivo è che quando non ci sono record, la clausola GROUP BY non ha nulla da raggruppare, e quindi non è in grado di darti alcun output.

Ad esempio:

SELECT COUNT(*) FROM (SELECT 'Dummy' AS [Dummy] WHERE 1 = 0) DummyTable 

tornerà un record con il valore '0', dove come:

SELECT COUNT(*) FROM (SELECT 'Dummy' AS [Dummy] WHERE 1 = 0) DummyTable 
GROUP BY [Dummy] 

tornerà nessun record.

+0

il motivo per cui ho usato per gruppo è a causa di questo errore 'Msg 8120, livello 16, stato 1, riga 2 colonna '# AllExpired.fld_LoanDate' non è valida nell'elenco di selezione perché non è contenuta in una funzione aggregata o nella clausola GROUP BY. qualsiasi suggerimento? come rimuovere l'errore senza utilizzare il gruppo per? – user2705620

+0

Bene, non è possibile rimuovere la clausola GROUP BY, se si desidera un elenco del conteggio totale, grammi e capitale per ogni mese di data del prestito. Una brutta soluzione, se vuoi che la tua query originale restituisca una riga con 0, quando non ci sono record, devi aggiungere qualcosa come questo alla tua query: 'UNION SELECT NULL AS [Month], 0 AS [COUNT], 0 AS [GRAMS], 0 AS [PRINCIPAL] WHERE (SELEZIONA CONTEGGIO (*) DA #AllExpired) = 0', ma una soluzione migliore sarebbe quella di fare in modo che l'applicazione gestisca la query originale senza restituire alcuna riga. – Dan

+0

Ci sono altri modi per aggirare questo problema, puoi anche usare 'COALESCE' con ogni campo per restituire 0 quando il risultato è' NULL'. Oppure utilizzare una subquery correlata per garantire che i dati di "livello superiore" vengano sempre restituiti, quindi qualsiasi funzione di aggregazione restituirà 0. – Tony

1

Forse #AllExpired è vuoto, o uno dei join non restituisce alcun risultato?

Ricordare che i join interni necessitano di risultati su entrambi i lati per poter tornare, quindi poiché #AllExpired è vuoto, il join non restituisce nulla.

Passare a un join OUTER.

+0

sì è vuoto, beh? non dovrebbe produrre zero? quando uso il conteggio delle funzioni>? – user2705620

2

posso immaginare che è necessario modificare i join dall'interno all'esterno per garantire righe vengono restituite anche quando non v'è alcuna traccia corrispondente nella tbl_PawnItem -

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.fld_LoanDate)) as [Month] 
    ,COUNT(PIT.fld_PawnItemID)'COUNT' 
    ,SUM (PIT.fld_KaratGram)'GRAMS' 
    ,SUM (PH.fld_PrincipalAmt)'PRINCIPAL' 
FROM #AllExpired AE 
    LEFT JOIN Transactions.tbl_PawnItem PIT 
     ON AE.fld_PawnMainID=PIT.fld_PawnMainID 
    LEFT JOIN Transactions.tbl_PawnHisto PH 
     ON AE.fld_PawnMainID=PH.fld_PawnMainID 
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.fld_LoanDate))) 
+0

ancora vuoto. :(. – user2705620

Problemi correlati