sql - sumar - Cambiar una SUMA devolvió NULL a cero
reemplazar null por cero oracle (6)
Tengo un procedimiento almacenado de la siguiente manera:
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 containts a generated list of total incidents by site/date (monthly)
''If a site doesnt have any incidents that month it wont be listed.
El problema que tengo es que un sitio no tiene ningún incidente este mes y, como tal, recibo un valor NULO devuelto para ese sitio cuando ejecuto este sproc, pero necesito que me devuelvan un cero / 0 dentro de una tabla en ssrs.
He intentado el uso de coalesce y es nula en vano.
SELECT COALESCE(SUM(c.Logged,0))
SELECT SUM(ISNULL(c.Logged,0))
¿Hay alguna manera de obtener este formato correctamente?
Aclamaciones,
Sotavento
La forma más fácil y más legible que he encontrado para lograr esto es a través de:
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
Me encontré con este problema en el oráculo. Oracle no tiene una función ISNULL (). Sin embargo, podemos usar la función NVL () para lograr el mismo resultado:
NVL(SUM(c.Logged), 0)
Podrías envolver el SELECT en otro SELECT así:
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
)
Ponlo afuera
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
Si está devolviendo varias filas, cambie INNER JOIN a 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
Por cierto, no coloque ninguna función o expresión dentro de las funciones agregadas si no está justificada, por ejemplo, no coloque ISNULL, COALESCE dentro de SUM, utilizando la función / expresión dentro del rendimiento de la mutilación de agregación, la consulta se ejecutará con el escaneo de tablas
Solo encontré este problema, la solución de Kirtan me funcionó bien, pero la sintaxis estaba un poco apagada. Me gustó esto:
ISNULL(SUM(c.Logged), 0)
La publicación me ayudó a resolver mi problema, así que gracias a todos.
Tendrás que usar ISNULL
esta manera -
ISNULL(SUM(c.Logged), 0)
O, como dijo Michael, puedes usar una unión externa izquierda.