2010-05-10 21 views
18

Mam procedury przechowywanej w następujący sposób:Zmiana SUM zwrócony NULL do zera

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. 

Problem mam jest to, że strona nie robi żadnych incydentów w tym miesiącu i jako taki i uzyskać wartość NULL zwracane dla tej witryny, gdy uruchamiam ten sproc, ale muszę mieć zero/0 zwrócone do użycia na wykresie w SSRS.

Próbowałem użyć koalescencji i isnull na próżno.

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

Czy istnieje sposób na poprawne sformatowanie tego pliku?

Cheers,

Lee

Odpowiedz

35

Umieścić go na zewnątrz:

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 

Jeśli powrocie wiele wierszy, zmień INNER JOIN 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 

przez sposób, nie kładź żadnej funkcji ani nie wyrażaj funkcje wewnątrz agregatu jonowego, jeśli nie jest to uzasadnione, np. nie umieszczać ISNULL, COALESCE wewnątrz SUM, używając funkcji/wyrażenie wewnątrz agregacja paraliżuje działanie, zapytanie zostanie wykonana ze skanowania tabeli

+0

I irytować wśród wielu anwsers Znalazłem do wydania byłem stoi, ale w końcu „COALESCE (SUM (i.Logged) , 0) "zrobił lewę, w bardzo elegancki i prosty sposób. Dzięki!! – TheCuBeMan

18

Będziesz musiał użyć ISNULL takiego -

ISNULL(SUM(c.Logged), 0)  

Or , jak powiedział Michael, możesz użyć Left Outer Join.

1

Można owinąć w inny SELECT SELECT tak:

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

Najprostszym i najbardziej czytelny sposób znalazłem się osiągnąć to poprzez:

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

Jeśli w tbl_Sites nie znaleziono żadnych wierszy, SUM nie zostanie ocenione i zwróci wartość NULL. –

1

Właśnie wpadł ten problem, rozwiązanie Kirtana działało dla mnie dobrze, ale składnia była trochę wyłączona. Zrobiłem to:

ISNULL(SUM(c.Logged), 0) 

Post pomógł mi rozwiązać mój problem, a więc dzięki wszystkim.

+0

, ale ISNULL nie znaleziono w Oracle – Gank

6

Ten problem napotkałem w wyroczni. Oracle nie ma funkcji ISNULL(). Jednakże, możemy użyć funkcji NVL(), aby osiągnąć ten sam rezultat:

NVL(SUM(c.Logged), 0)