Как заставить SQL Server возвращать значение по умолчанию 0, если строк не существует? - PullRequest
8 голосов
/ 17 сентября 2009

Как я могу получить значение по умолчанию 0, если сумма не возвращает никаких строк?

Редактировать: я отредактировал этот пост, чтобы добавить более подробный пример (с которым предыдущий не сталкивался)

* 1005 Е.Г. *

 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

Это вернет

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

Но я хочу, чтобы в качестве значения по умолчанию возвращалось 0. Однако, если вы сделаете SELECT для его выбора, тогда будет получен второй SELECT для выбора значения по умолчанию, 2 набора результатов.

Могу ли я сделать это только в одном? Я посмотрел на COALESCE, но это работает, только если возвращается NULL, а это не так.

Редактировать : Я думаю, что проблема связана с группой, но есть ли причина, почему она все еще не дает никаких результатов?

Ответы [ 4 ]

13 голосов
/ 17 сентября 2009

Попробуйте это

SELECT ISNULL(SUM(Debt) ,0)
FROM SupplierDebt
WHERE Id = @TestId
10 голосов
/ 17 сентября 2009

Или используйте

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

COALESCE - это стандарт ANSI, если это вас беспокоит и может принимать несколько параметров.

4 голосов
/ 17 сентября 2009
 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
2 голосов
/ 17 сентября 2009

SQL 2k5: у меня это сработало:

isnull(sum(Dept), 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...