Подтвердить что ты не робот

Изменение 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.

У меня проблема в том, что в этом месяце на сайте не было инцидентов, и поэтому я получил значение NULL, возвращаемое для этого сайта, когда я запускаю этот процесс, но мне нужно вернуть ноль /0, чтобы использовать его в график в SSRS.

Я пытался использовать коалесц и безрезультатно.

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

Есть ли способ получить это отформатировано правильно?

Ура,

подветренный

4b9b3361

Ответ 1

Поместите его снаружи:

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 внутри СУММЫ, используя функцию/выражение внутри производительности кадровых сбоев, запрос будет выполнен с проверкой таблицы

Ответ 2

Вам нужно использовать ISNULL как это -

ISNULL(SUM(c.Logged), 0)      

Или, как сказал Майкл, вы можете использовать Left Outer Join.

Ответ 3

Я столкнулся с этой проблемой в Oracle. В Oracle нет функции ISNULL(). Однако мы можем использовать функцию NVL() для достижения того же результата:

NVL(SUM(c.Logged), 0)

Ответ 4

Самый простой и читаемый способ, который я нашел для этого, - через:

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  

Ответ 5

Вы можете обернуть SELECT в другой SELECT так:

 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
)

Ответ 6

Просто столкнулся с этой проблемой, решение Kirtan работало для меня хорошо, но синтаксис был немного неактивен. Мне это понравилось:

ISNULL(SUM(c.Logged), 0)

Сообщение помогло мне решить мою проблему, хотя так спасибо всем.