2009-09-17 9 views
8

¿Cómo puedo obtener un valor predeterminado de 0 si una suma no devuelve ninguna fila?¿Cómo hacer que SQL Server devuelva un valor por defecto de 0, si no existen filas?

Edición: He editado este post para añadir un ejemplo más detallado (que la anterior no encontró)

P. ej

DECLARE @Item TABLE 
(
    Id int, 
    Price decimal, 
    PricePer decimal 
) 

DECLARE @OrderItem TABLE 
(
    Id int, 
    ItemId int, 
    ChargedPrice nvarchar(10), 
    QtyRequired int, 
    QtyLeftToDespatch int 
) 

INSERT INTO @Item (Id,Price,PricePer) VALUES (1,1.00, 1) 
INSERT INTO @Item (Id,Price,PricePer) VALUES (2,2.00, 1) 
INSERT INTO @Item (Id,Price,PricePer) VALUES (3,3.00, 1) 
INSERT INTO @Item (Id,Price,PricePer) VALUES (4,4.00, 1) 

INSERT INTO @OrderItem (Id, ItemId,ChargedPrice,QtyRequired,QtyLeftToDespatch) VALUES (1,1,100,100,50) 
INSERT INTO @OrderItem (Id, ItemId,ChargedPrice,QtyRequired,QtyLeftToDespatch) VALUES (2,1,200,300,50) 
INSERT INTO @OrderItem (Id, ItemId,ChargedPrice,QtyRequired,QtyLeftToDespatch) VALUES (3,1,300,300,50) 

DECLARE @ItemIdTest int 
SET @ItemIdTest = 4 

SELECT SUM((price/priceper)*QtyRequired) as total_value, 
     SUM((price/priceper)*QtyRequired) as outstanding_value 
FROM @Item i 
INNER JOIN @OrderItem o ON i.Id = o.ItemId 
WHERE i.Id = @ItemIdTest 
group by itemId 

Esto devolverá

total_value, outstanding_value 
============== 
<No rows> 

Pero yo quiero que tenga 0 como valor predeterminado devuelto. Sin embargo, si hace un SELECCIONAR para seleccionarlo, entonces se devolverá un segundo SELECCIONAR para seleccionar un predeterminado, 2 conjuntos de resultados.

¿Puedo hacerlo solo en una? He examinado COALESCE, pero esto solo funciona si se devuelve NULL, que no es así.

Editar: Creo que el problema tiene que ver con el grupo, pero ¿hay alguna razón por la que todavía no se obtenga ningún resultado?

+0

He cambiado el ejemplo, que experimenta el error, en lugar del que creé antes de –

Respuesta

4
DECLARE @Item TABLE 
(
    Id int, 
    Price decimal, 
    PricePer decimal 
) 

DECLARE @OrderItem TABLE 
(
    Id int, 
    ItemId int, 
    ChargedPrice nvarchar(10), 
    QtyRequired int, 
    QtyLeftToDespatch int 
) 

INSERT INTO @Item (Id,Price,PricePer) VALUES (1,1.00, 1) 
INSERT INTO @Item (Id,Price,PricePer) VALUES (2,2.00, 1) 
INSERT INTO @Item (Id,Price,PricePer) VALUES (3,3.00, 1) 
INSERT INTO @Item (Id,Price,PricePer) VALUES (4,4.00, 1) 

INSERT INTO @OrderItem (Id, ItemId,ChargedPrice,QtyRequired,QtyLeftToDespatch) VALUES (1,1,100,100,50) 
INSERT INTO @OrderItem (Id, ItemId,ChargedPrice,QtyRequired,QtyLeftToDespatch) VALUES (2,1,200,300,50) 
INSERT INTO @OrderItem (Id, ItemId,ChargedPrice,QtyRequired,QtyLeftToDespatch) VALUES (3,1,300,300,50) 

DECLARE @ItemIdTest int 
SET @ItemIdTest = 4 

SELECT COALESCE(SUM((price/priceper)*QtyRequired),0) as total_value, 
     COALESCE(SUM((price/priceper)*QtyRequired),0) as outstanding_value 
FROM @Item i 
LEFT OUTER JOIN @OrderItem o ON i.Id = o.ItemId 
WHERE i.Id = @ItemIdTest 
group by itemId 
+0

cuando, por ejemplo, SET @ItemIdTest = 5 (itemId no existente) devolverá filas vacías – kristof

+0

¡Creo que necesita volver a pensar en el diseño de su aplicación! – bleeeah

+0

+1 realmente mirando nuevamente a su solución parece que debería funcionar para este problema – kristof

13

Prueba este

SELECT ISNULL(SUM(Debt) ,0) 
FROM SupplierDebt 
WHERE Id = @TestId 
+0

+1 Me pegó. – NYSystemsAnalyst

2

2k5 SQL: esto funcionó para mí:

isnull(sum(Dept), 0) 
10

O utilice

SELECT COALESCE(SUM(Debt) ,0) 
FROM SupplierDebt 
WHERE Id = @TestId 

COALESCE es un estándar ANSI, si eso te molesta y puede tomar múltiples parámetros

Cuestiones relacionadas