2010-05-10 25 views
18

Tôi có một Stored Procedure như sau:thay đổi một SUM trở NULL để zero

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. 

Vấn đề tôi đang gặp là một trang web doesnt có bất kỳ sự cố trong tháng này và như vậy tôi nhận được một giá trị NULL trở lại cho trang web đó khi tôi chạy sproc này, nhưng tôi cần phải có một số không/0 trả lại được sử dụng trong một biểu đồ trong SSRS.

Tôi đã thử sử dụng kết hợp và không có kết quả.

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

Có cách nào để định dạng này chính xác không?

Chúc mừng,

Lee

Trả lời

35

Đặt nó bên ngoài:

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 

Nếu bạn đang trở nhiều hàng, thay đổi 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 

Vào cách, không đặt bất kỳ chức năng hoặc thể hiện ion bên trong hàm tổng hợp nếu nó không được bảo hành, ví dụ: không đặt ISNULL, liên hiệp bên trong SUM, sử dụng chức năng/biểu hiện bên trong tập hợp cripples hiệu suất, truy vấn sẽ được thực hiện với bảng quét

+0

Tôi đã nhầm lẫn giữa nhiều người anwsers mà tôi đã gặp phải, nhưng cuối cùng "COALESCE (SUM (i.Logged) , 0) "đã làm các trick, và một cách rất thanh lịch và đơn giản. Cảm ơn!! – TheCuBeMan

18

Bạn sẽ phải sử dụng ISNULL như thế này -

ISNULL(SUM(c.Logged), 0)  

Hoặc , như Michael đã nói, bạn có thể sử dụng Left Join Join.

1

Bạn có thể quấn SELECT trong một CHỌN như vậy:

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

Cách dễ dàng nhất, và dễ đọc nhất, cách tôi đã tìm thấy để thực hiện điều này là thông qua:

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

Nếu không tìm thấy hàng nào trong tbl_Sites SUM không được đánh giá và trả về NULL. –

1

Chỉ cần chạy vào vấn đề này, giải pháp của Kirtan đã làm việc tốt cho tôi, nhưng cú pháp hơi lệch. Tôi đã làm như thế này:

ISNULL(SUM(c.Logged), 0) 

Bài đăng đã giúp tôi giải quyết vấn đề của mình mặc dù cảm ơn tất cả.

+0

nhưng không tìm thấy ISNULL trong oracle – Gank

6

Tôi gặp vấn đề này trong oracle. Oracle không có hàm ISNULL(). Tuy nhiên, chúng tôi có thể sử dụng chức năng NVL() để đạt được kết quả tương tự:

NVL(SUM(c.Logged), 0) 
Các vấn đề liên quan