Modifica di un SUM NULL tornato a zero
Domanda
Ho una stored procedure come segue:
CREATE PROC [dbo].[Incidents]
(@SiteName varchar(200))
AS
SELECT
(
SELECT SUM(i.Logged)
FROM tbl_Sites s
INNER JOIN tbl_Incidents i
ON s.Location = i.Location
WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)
GROUP BY s.Sites
) AS LoggedIncidents
'tbl_Sites contains a list of reported on sites.
'tbl_Incidents contains a generated list of total incidents by site/date (monthly)
'If a site doesn't have any incidents that month it wont be listed.
Il problema che sto avendo è che un sito non ha Incidenti di questo mese e come tale ho ottenuto un valore NULL restituito per quel sito quando ho eseguito questo proc, ma ho bisogno di avere uno zero / 0 restituito al essere utilizzato all'interno di un grafico in SSRS.
Ho provato con coalesce e isnull senza alcun risultato.
SELECT COALESCE(SUM(c.Logged,0))
SELECT SUM(ISNULL(c.Logged,0))
C'è un modo per ottenere questo formattata correttamente?
Saluti,
Lee
Soluzione
Mettere fuori:
SELECT COALESCE(
(
SELECT SUM(i.Logged)
FROM tbl_Sites s
INNER JOIN tbl_Incidents i
ON s.Location = i.Location
WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)
GROUP BY s.Sites
), 0) AS LoggedIncidents
Se si restituisce più righe, il cambiamento INNER JOIN a LEFT JOIN
SELECT COALESCE(SUM(i.Logged),0)
FROM tbl_Sites s
LEFT JOIN tbl_Incidents i
ON s.Location = i.Location
WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)
GROUP BY s.Sites
A proposito, non mettere alcuna funzione o espressione contenuta funzioni di aggregazione se non è giustificata, ad esempio non mettere ISNULL, COALESCE all'interno di SUM, utilizzando la funzione / espressione all'interno aggregazione paralizza prestazioni, l'interrogazione verrà eseguita con scansione tabella
Altri suggerimenti
Dovrete usare ISNULL
come questo -
ISNULL(SUM(c.Logged), 0)
O, come ha detto Michael, è possibile utilizzare un Left Outer Join.
ho incontrato questo problema in Oracle.
Oracle non ha una funzione ISNULL()
. Tuttavia, possiamo usare la funzione NVL()
per ottenere lo stesso risultato:
NVL(SUM(c.Logged), 0)
Il modo più semplice e più leggibile, modo che ho trovato per farlo è attraverso:
CREATE PROC [dbo].[Incidents]
(@SiteName varchar(200))
AS
SELECT SUM(COALESCE(i.Logged, 0)) AS LoggedIncidents
FROM tbl_Sites s
INNER JOIN tbl_Incidents i
ON s.Location = i.Location
WHERE s.Sites = @SiteName
AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)
GROUP BY s.Sites
Si potrebbe avvolgere il SELEZIONA in un altro SELEZIONA in questo modo:
CREATE PROC [dbo].[Incidents]
(@SiteName varchar(200))
AS
SELECT COALESCE(TotalIncidents ,0)
FROM (
SELECT
(
SELECT SUM(i.Logged) as TotalIncidents
FROM tbl_Sites s
INNER JOIN tbl_Incidents i
ON s.Location = i.Location
WHERE s.Sites = @SiteName AND i.[month] = DATEADD(mm, DATEDIFF(mm, 0, GetDate()) -1,0)
GROUP BY s.Sites
) AS LoggedIncidents
)
Proprio imbattuto in questo problema, la soluzione di Kirtan ha funzionato per me bene, ma la sintassi era un po 'fuori. Ho fatto in questo modo:
ISNULL(SUM(c.Logged), 0)
Post mi ha aiutato a risolvere il mio problema, però così, grazie a tutti.