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

È stato utile?

Soluzione

Mettere fuori:

SELECT COALESCE(

(  
    SELECT SUM(i.Logged)  
    FROM tbl_Sites s  
    INNER JOIN tbl_Incidents i  
    ON s.Location = i.Location  
    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.Location  
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.

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