2010-05-10 14 views
18

Tengo un procedimiento almacenado de la siguiente manera:Cambio de un SUM devuelve NULL a cero

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 estoy teniendo es que un sitio tampoco tienen ningún incidente de este mes y como tal me sale un valor NULL devuelto para ese sitio cuando ejecuto este sproc, pero necesito tener un cero/0 devuelto para ser utilizado dentro de un gráfico en SSRS.

He intentado el uso de coalesce e isnull en vano.

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

¿Hay alguna manera de obtener esto formateado correctamente?

Saludos,

Lee

Respuesta

35

que se halle:

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 

Si va a devolver varias filas, el cambio interior JOIN para 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 

Por el manera, no ponga ninguna función o exprese ion dentro de funciones agregadas si no está garantizado, p. no ponga ISNULL, se unen en el interior de SUMA, el uso de la función/expresión dentro de la agregación paraliza el rendimiento, la consulta se ejecuta con recorrido de tabla

+0

que se confundió entre muchos anwsers que he encontrado para el problema que estaba enfrentando, pero con el tiempo "COALESCE (SUM (i.Logged) , 0) "hizo el truco, y de una manera muy elegante y simple. ¡¡Gracias!! – TheCuBeMan

18

Vas a tener que utilizar ISNULL como esto -

ISNULL(SUM(c.Logged), 0)  

O , como dijo Michael, puedes usar una unión externa izquierda.

1

Se puede envolver el SELECT en otra Seleccione este modo:

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 
) 
2

La forma más fácil y más fácil de leer, así 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 
+1

Si no se encuentran filas en tbl_Sites SUM no se evalúa y devuelve NULL. –

1

acabo de encontrar Este problema, la solución de Kirtan funcionó bien para mí, pero la sintaxis estaba un poco desajustada. Me gustó esto:

ISNULL(SUM(c.Logged), 0) 

La publicación me ayudó a resolver mi problema, así que gracias a todos.

+0

pero ISNULL no se encuentra en el oráculo – Gank

6

He encontrado este problema en el oráculo. Oracle no tiene una función ISNULL(). Sin embargo, podemos utilizar la función NVL() para obtener el mismo resultado:

NVL(SUM(c.Logged), 0) 
Cuestiones relacionadas