Sql 当使用订单时,我得到;遇到除以零的错误。”;

Sql 当使用订单时,我得到;遇到除以零的错误。”;,sql,sql-server,Sql,Sql Server,我有下面的SQL查询,如果我删除最后一行order by,它就会工作。 有谁能告诉我,为什么我在这个查询上下订单时,这不起作用 declare @UQ as decimal(20,6); declare @MUQ as decimal(20,6); select @UQ=ItemUnit_UnitQuantity, @MUQ=ItemUnit_MainUnitQuantity from tItemUnit where ItemUnit_Id = 23996 select top 1 (I

我有下面的SQL查询,如果我删除最后一行order by,它就会工作。 有谁能告诉我,为什么我在这个查询上下订单时,这不起作用

declare @UQ as decimal(20,6); 
declare @MUQ as decimal(20,6); 

select @UQ=ItemUnit_UnitQuantity, @MUQ=ItemUnit_MainUnitQuantity from tItemUnit 
where ItemUnit_Id = 23996
select top 1 (InvBuyPriceValue/InvL_Quantity)*iu.ItemUnit_UnitQuantity/iu.ItemUnit_MainUnitQuantity*@MUQ/@UQ  as InvBuyPrice, Discount
from tInvL l 
left outer join tInvH h on h.InvH_Id = l.InvH_Id 
left outer join tItem i on i.Item_Id = l.Item_Id 
left outer join tItemUnit iu on iu.ItemUnit_Id = l.ItemUnit_Id 
left outer join tUnit u on u.Unit_Id = iu.Unit_Id
left outer join tClientObj clo on clo.ClientObj_Id = h.ClientObj_Id 
left outer join tDocType dt on dt.DocType_Id = h.DocType_Id 
where h.CompanyObj_Id = (select CompanyObj_Id from tEnabledCompany where CompanyClientObj_Id=(select ClientObj_Id from tClientObj where ClientObj_Code = '504'))
and dt.DocType_InOut = 1
and l.Item_Id = 19558
and h.ClientObj_Id = 386
order by InvH_DocDate desc, InvH_DocTime desc
我得到的错误是: 遇到被零除的错误。

我不明白为什么我在ORDERBY上得到这个错误,而不是在select语句中

SELECT TOP 1
    (InvBuyPriceValue / InvL_Quantity) * 
     iu.ItemUnit_UnitQuantity / iu.ItemUnit_MainUnitQuantity * 
     @MUQ / @UQ AS InvBuyPrice,
这是您执行分区的唯一地方。
InvL\u Quantity
ItemUnit\u MainUnitQuantity
列可能包含值零


同时检查
ItemUnit\u UnitQuantity
,这是分配给
@UQ
的值,也是一个除数。

中有除数

select top 1 (InvBuyPriceValue/InvL_Quantity)*iu.ItemUnit_UnitQuantity/iu.ItemUnit_MainUnitQuantity*@MUQ/@UQ
所以可能InvL_数量或iu.ItemUnit_MainUnitQuantity为零

如果没有ORDER BY,为什么看不到SQL Server错误?您只请求前1行,因此SQL Server不需要检查所有行并计算结果。出于性能方面的原因,SQL Server只选择最上面的1行,计算结果并返回结果


你得到的除法是0和前1,而不是没有,这只是偶然的。如果您没有TOP 1和ORDER BY,您肯定会看到相同的错误。

(InvBuyPriceValue/InvL_Quantity)在将其与ORDER BY除以之前检查此值。您应该看到发生了什么。因为如果没有order by,它可以只取为结果集计算的第一行,并且(可能)该行碰巧包含非零的
InvL\u Quantity
iu.ItemUnit\u MainUnitQuantity
值。但是当您添加
ORDER BY
时,必须生成更多的行,并且其中一行或多行包含上述一个或两个值的零值。