Изменение 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))
Есть ли способ получить это отформатировано правильно?
Ура,
подветренный
Ответы
Ответ 1
Поместите его снаружи:
SELECT COALESCE(
(
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
), 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.Location
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)
Сообщение помогло мне решить мою проблему, хотя так спасибо всем.