2009-09-17 6 views
8

Comment puis-je obtenir une valeur par défaut de 0 si une somme ne renvoie aucune ligne?Comment obtenir SQL Server pour renvoyer une valeur par défaut de 0, si aucune ligne n'existe?

Edit: J'ai édité ce post pour ajouter un exemple plus complet (que le précédent n'a pas rencontré)

Par ex

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 

Cela renverra

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

Mais je veux qu'il y ait 0 comme valeur par défaut est revenu. Cependant, si vous faites un SELECT pour le sélectionner, puis un second SELECT pour sélectionner un défaut, 2 ensembles de résultats seront retournés.

Puis-je le faire en un? J'ai regardé COALESCE, mais cela ne fonctionne que si NULL est retourné, ce qui n'est pas le cas.

Édition: Je pense que le problème est lié au groupe, mais y a-t-il une raison pour laquelle il ne revient pas avec des résultats?

+0

J'ai changé l'exemple, qui connaît l'erreur, plutôt que celui que j'ai créé avant –

Répondre

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

lorsque vous effectuez, par exemple, SET @ItemIdTest = 5 (itemId non existant) il va retourner des lignes vides – kristof

+0

Je pense qu'il doit repenser le design de son application! – bleeeah

+0

+ 1 regardant réellement votre solution il semble que cela devrait fonctionner pour ce problème – kristof

13

Essayez cette

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

+ 1 Battez-moi. – NYSystemsAnalyst

2

2K5 SQL: cela a fonctionné pour moi:

isnull(sum(Dept), 0) 
10

Ou utilisez

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

COALESCE est une norme ANSI, si cela vous dérange et peut prendre plusieurs paramètres.

Questions connexes