2010-05-10 6 views
18

ich eine gespeicherte Prozedur haben wie folgt:Ändern einer Summe NULL auf Null zurück

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 containts a generated list of total incidents by site/date (monthly) 
'If a site doesnt have any incidents that month it wont be listed. 

Das Problem ist, ich habe, dass eine Website leider nicht alle Vorfälle in diesem Monat haben und als solche ich einen NULL-Wert zurückerhalten für diese Seite, wenn ich diesen Sproc, aber ich muss eine Null/0 zurückgegeben, um in einem Diagramm in SSRS verwendet werden.

Ich habe versucht, die Verwendung koaleszieren und isnull ohne Erfolg.

SELECT COALESCE(SUM(c.Logged,0)) 
    SELECT SUM(ISNULL(c.Logged,0)) 

Gibt es eine Möglichkeit, diese richtig zu formatieren?

Cheers,

Lee

Antwort

35

draußen Put:

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 

Wenn Sie mehrere Zeilen zurückgeben, INNER LEFT

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 

Durch das JOIN JOIN ändern Weise, setze keine Funktion oder ausdrücke Ionen innerhalb von Aggregatfunktionen, wenn es nicht gerechtfertigt ist, z.B. setzen nicht ISNULL, COALESCE innerhalb von SUM, mit der Funktion/Ausdruck innerhalb Aggregation Leistung lähmt, wird die Abfrage mit Tabellenscan ausgeführt werden

+0

ich unter vielen anwsers verwirrt habe ich für das Problem gefunden habe ich konfrontiert war, aber schließlich „COALESCE (SUM (i.Logged) , 0) "taten den Trick, und auf eine sehr elegante und einfache Art und Weise. Vielen Dank!! – TheCuBeMan

18

Sie müssen ISNULL wie diese verwenden -

ISNULL(SUM(c.Logged), 0)  

Or Wie Michael sagte, können Sie eine Linke Äußere Verbindung verwenden.

1

Sie könnten die SELECT in einer anderen wickeln SELECT wie folgt:

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 
) 
2

Die einfachste und am besten lesen, Art und Weise habe ich zu erreichen gefunden dies ist durch:

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 
+1

Wenn in tbl_Sites keine Zeilen gefunden werden, wird SUM nicht ausgewertet und gibt NULL zurück. –

1

lief einfach in Dieses Problem, Kirtans Lösung funktionierte für mich gut, aber die Syntax war ein wenig aus. Ich mochte das:

ISNULL(SUM(c.Logged), 0) 

Beitrag half mir mein Problem zu lösen, obwohl so danke an alle.

+0

aber ISNULL nicht in Oracle gefunden – Gank

6

Ich habe dieses Problem in Oracle. Oracle hat keine ISNULL() - Funktion. Wir können jedoch die NVL() Funktion verwenden, um das gleiche Ergebnis zu erzielen:

NVL(SUM(c.Logged), 0)