2009-06-17 84 views
48

Tengo una consulta que cuenta el precio de todos los artículos entre dos fechas. Aquí está la instrucción select:¿Cómo puedo cambiar NULL a 0 cuando obtengo un valor único de una función SQL?

SELECT SUM(Price) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

Puede suponer que todas las tablas se han configurado correctamente.

Si hago un selecto entre dos fechas y no hay elementos dentro de ese intervalo de tiempo, la función devuelve NULL como el TotalPrice en vez de 0.

Cómo me puedo asegurar que si no se encuentran registros, 0 se devuelve en lugar de NULL?

Respuesta

84

mayoría de los servidores de bases de datos tienen una función COALESCE, que devolverá el primer argumento que no es nulo, por lo que el siguiente debe hacer lo que quiera:

SELECT COALESCE(SUM(Price),0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

[editar]

Solo para aclarar cosas ya que parece haber mucha discusión sobre "COALESCE/ISNULL aún devolverá NULL si no hay filas coincidentes", pruebe esta consulta puede copiar y pegar en SQL Server directamente como está:

SELECT coalesce(SUM(column_id),0) AS TotalPrice 
FROM sys.columns 
WHERE (object_id BETWEEN -1 AND -2) 

Tenga en cuenta que la cláusula where excluye todas las filas de sys.columns de la consideración, pero el operador 'suma' sigue dando como resultado una fila única que es nula, que se fusiona para ser una sola fila con 0.

Espero que esto ayude a explicarlo.

+0

Si lees la pregunta que quiere 0 que se devuelva si no hubo resultados, esto solo funcionará si el resultado de la suma es nulo – Tetraneutron

+0

@Tetraneutron: Creo que funcionará. sum (price) será nulo si no hay filas, pero siempre habrá exactamente una fila de resultados. – Thilo

+0

COALESCE funciona bien siempre que obtenga una fila para que funcione (lo que hace en este caso). COALESCE no te ayudará si no obtienes filas atrás. –

12
SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

Eso debería hacer el truco.

6

Editar: Parece que todo el mundo se me adelantó jaja

encontrado la respuesta.

ISNULL() determina qué hacer cuando tiene un valor nulo.

En este caso, mi función devuelve un valor nulo, por lo que necesitaba especificar un 0 para ser devuelto en su lugar.

SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded 
BETWEEN @StartDate AND @EndDate) 
+0

isnull o coalesce funcionarán – BlackTigerX

+0

Creo que IFNULL es el equivalente de MySQL e ISNULL es para MS-T-SQL . – ojrac

+1

Tiene la declaración ISNULL al revés para lo que intenta hacer. Creo que quiere esto en su lugar: SUM (ISNULL (Precio, 0)) – JohnFx

9
SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 
+0

Esto lo hará – Tetraneutron

+0

Acabo de probarlo con una tabla vacía y funciona RBarry ... – CodeRedick

+0

Ver mi respuesta a continuación. Simplemente use ISNULL (o COALESCE) dos veces, una para cada fila y luego la suma. SELECT ISNULL (SUMA (ISNULL (precio, 0)), 0)) – dkretz

3

Usted podría utilizar

SELECT ISNULL(SUM(ISNULL(Price, 0)), 0).

Estoy 99% seguro de que funcionará.

+5

El ISNULL interno no es necesario, ya que SUM simplemente ignorará los valores NULL. – sayap

5
SELECT COALESCE(
    (SELECT SUM(Price) AS TotalPrice 
    FROM Inventory 
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate)) 
    , 0) 

Si la tabla tiene filas en la respuesta, devuelve SUM (precio). Si la SUMA es NULA o no hay filas, devolverá 0.

Poniendo COALESCE (SUMA (Precio), 0) NO funciona en MSSQL si no se encuentran filas.

+0

Por supuesto, esto evita que obtenga más de un valor a la vez de la tabla Inventario. – Paul

1

ORACLE/PLSQL:

NVL FUNCIÓN comunicado

SELECT NVL(SUM(Price), 0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

Esta SQL volvería 0 si el SUM(Price) devuelve un valor nulo. De lo contrario, devolvería el valor SUM(Price).

-5

La manera más fácil de hacerlo es simplemente agregar cero a su resultado.

decir

$A=($row['SUM'Price']+0); 
echo $A; 

esperanza esto ayuda !!

+1

Esto podría funcionar si el iniciador del tema tiene un código PHP para interpretar los resultados, pero si la pregunta está limitada a SQL, esto no servirá como respuesta. – Vesper

Cuestiones relacionadas