更改SUM返回NULL为零

Ice*_*ols 28 sql null sum coalesce 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 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.
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是网站本月没有任何事件,因此当我运行此sproc时,我得到为该网站返回的NULL值,但我需要返回一个零/ 0来在图表中使用在SSRS.

我尝试过使用coalesce并且无效.

    SELECT COALESCE(SUM(c.Logged,0))
    SELECT SUM(ISNULL(c.Logged,0))
Run Code Online (Sandbox Code Playgroud)

有没有办法正确地格式化?

干杯,

背风处

Mic*_*uen 50

把它放在外面:

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
Run Code Online (Sandbox Code Playgroud)

如果要返回多行,请将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  
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果没有保证,不要在聚合函数中放置任何函数或表达式,例如不要将ISNULL,COALESCE放在SUM内,使用函数/表达式聚合跛行性能,查询将使用表扫描执行


Kir*_*tan 25

你必须这样使用ISNULL-

ISNULL(SUM(c.Logged), 0)      
Run Code Online (Sandbox Code Playgroud)

或者,正如迈克尔所说,你可以使用左外连接.


Gua*_*hen 8

我在oracle中遇到了这个问题.Oracle没有ISNULL()函数.但是,我们可以使用NVL()函数来实现相同的结果:

NVL(SUM(c.Logged), 0)
Run Code Online (Sandbox Code Playgroud)