如果不存在行,如何让SQL Server返回默认值0?
如果总和不返回任何行,如何获得默认值0 编辑:我编辑了这篇文章,添加了一个更全面的例子(上一篇文章没有遇到) 例如 这会回来的如果不存在行,如何让SQL Server返回默认值0?,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果总和不返回任何行,如何获得默认值0 编辑:我编辑了这篇文章,添加了一个更全面的例子(上一篇文章没有遇到) 例如 这会回来的 total_value, outstanding_value ============== <No rows> 总价值,未付价值 ============== 但我希望它返回0作为默认值。但是,如果您选择它,然后再选择一个默认值,将返回两个结果集 我能一次完成吗?我已经研究了COALESCE,但这仅在返回NULL时有效,而实际情况并非如此 编辑:我认为问
total_value, outstanding_value
==============
<No rows>
总价值,未付价值
==============
但我希望它返回0作为默认值。但是,如果您选择它,然后再选择一个默认值,将返回两个结果集
我能一次完成吗?我已经研究了COALESCE,但这仅在返回NULL时有效,而实际情况并非如此
编辑:我认为问题是与组有关,但是否有原因使它仍然没有返回任何结果?试试这个
SELECT ISNULL(SUM(Debt) ,0)
FROM SupplierDebt
WHERE Id = @TestId
SQL 2k5:这对我很有用:
isnull(sum(Dept), 0)
或使用
SELECT COALESCE(SUM(Debt) ,0)
FROM SupplierDebt
WHERE Id = @TestId
COALESCE是一个ANSI标准,如果这让您感到困扰,可以使用多个参数。我已经更改了示例,该示例遇到了错误,而不是我以前创建的示例。例如,设置@ItemIdTest=5(不存在itemId),它将返回空行。我认为他需要重新考虑他的应用程序的设计+1实际上,再看看您的解决方案,它似乎应该可以解决这个问题。当我询问itemId时,如果像5(没有返回行)那样根本不存在,而itemId在任何订单中都不存在(返回0),那么期望0是没有意义的。为什么获取总计是一个设计问题?这当然表明我们正在考虑所有的可能性?我在这里过于简化了。进行此查询的原因是为了找出用此处的项目替换的供应商应支付的金额)。但是,这样做的目的是为查询提供一个供应商ID,查询将返回该供应商的未付款金额(而不是项目)。对我来说这不是一个设计缺陷吗?
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
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