更改 SUM 返回 NULL 为零

新手上路,请多包涵

我有一个存储过程如下:

 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.

我遇到的问题是该站点本月没有任何事件,因此当我运行此 proc 时,我为该站点返回了一个 NULL 值,但我需要返回一个零/0 才能在其中使用SSRS 中的图表。

我试过使用 coalesce 和 isnull 无济于事。

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

有没有办法让这个格式正确?

干杯,

原文由 Icementhols 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 580
2 个回答

放在外面:

 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

如果要返回多行,请将 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

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

原文由 Michael Buen 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

 NVL(SUM(c.Logged), 0)

原文由 Guangtong Shen 发布,翻译遵循 CC BY-SA 4.0 许可协议