在我的网站中,作者可以上传他们的图书。 我在每个页面上显示统计数据,我显示的统计数据之一是作者书籍的平均评分。 我把所有评级的总和除以书的数量:
select
sum(BookRate)/count(BookID) as AvrageRate
from Books
where Author = "Some Author"
当用户尚未上传任何图书并且返回明显的错误消息时,会出现问题:
Divide by zero error encountered.
有没有办法在SQL查询中避免这种情况,或者我是否必须首先使用一个查询检查图书计数,然后对统计信息运行另一个查询?
谢天谢地。
答案 0 :(得分:5)
您可以使用CASE
来满足零的总和:
select case sum (BookID)
when 0 then 0
else sum (BookRate)/sum (BookID)
end as AvrageRate
from Books where Author="Some Author"
顺便说一句,你不想除以计数,而不是求和得到平均值吗?:
select case count(BookID)
when 0 then 0
else sum (BookRate)/count(BookID)
end as AvrageRate
from Books where Author="Some Author"
答案 1 :(得分:3)
如果您使用的是Oracle
,则可以使用NULLIF()NULLIF( 0, 0 )
在SQL Server中,您也可以尝试:
Select dividend / nullif(divisor, 0)
所以在你的情况下,它可能是这样的:
select sum (BookRate)/nullif(sum (BookID),0) as AvrageRate
from Books where Author="Some Author"
答案 2 :(得分:3)
如果用户没有上传任何图书,那么我不相信你会得到一个被零除错误。相反,不会返回任何行。
无论如何,最安全的方法是使用case
语句:
select (case when sum(BookId) > 0 then sum(BookRate)/count(BookID) end) as AvrageRate
from Books
where Author="Some Author";
或者,对于这种特殊情况,使用avg()
聚合函数:
select avg(BookRate) as AvrageRate
from Books
where Author="Some Author";