Изменение СУММЫ возвратило ПУСТОЙ УКАЗАТЕЛЬ для обнуления

У меня есть хранимая процедура следующим образом:

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, но мне нужно было возвратить нуль/0, чтобы использоваться в рамках диаграммы в SSRS.

Я попытался использовать, объединяют и isnull напрасно.

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

Существует ли способ отформатировать это правильно?

Удачи,

Lee

28
задан Sana 12 July 2019 в 11:35
поделиться

5 ответов

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

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  

Кстати, не t помещать любую функцию или выражение внутрь агрегатных функций, если это не требуется, например не помещайте ISNULL, COALESCE внутри SUM, использование функции / выражения внутри агрегации снижает производительность, запрос будет выполнен со сканированием таблицы

50
ответ дан 28 November 2019 в 02:28
поделиться

Вам придется использовать ISNULL вот так -

ISNULL(SUM(c.Logged), 0)      

Или, как сказал Майкл, вы можете использовать левое внешнее соединение.

25
ответ дан 28 November 2019 в 02:28
поделиться

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

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  
2
ответ дан 28 November 2019 в 02:28
поделиться

Вы можете заключить 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
)
1
ответ дан 28 November 2019 в 02:28
поделиться

Только что столкнулся с этой проблемой, решение Киртана у меня сработало, но синтаксис был немного неправильным. Мне понравилось это:

ISNULL(SUM(c.Logged), 0)

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

1
ответ дан 28 November 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: