关于sql运算中被0除的错误怎么解决

fishinseaspt 2008-02-27 08:16:17
我编一个运算的程序,下面的[本期业务收入]有时是0,一运算后程序提示 遇到被0除的错误,这种问题得怎么屏蔽呢,我不知道怎么写屏蔽代码,请高手指教
with ADOQuery1 do
begin
close;
sql.Clear ;
sql.Add('select [id号], [名称]',);
sql.Add('[本期利润]/[本期业务收入] as 本期毛利率');
sql.Add('from _table');
open;
end;
...全文
505 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishinseaspt 2008-02-28
  • 打赏
  • 举报
回复
谢谢给位啊,问题解决了,给分
阿三 2008-02-28
  • 打赏
  • 举报
回复
"isnull([本期业务收入],0)=0的值查出来显示“错误”2个字"

你如果想这样显示那就肯定会出错了,因为当<>0时,执行 [本期利润]/[本期业务收入] 是数字型的
你只能这样写
SELECT [id号], [名称],
(CASE isnull([本期业务收入],0)
WHEN 0 THEN '错误'
ELSE cast([本期利润]/[本期业务收入] as varchar(30))
END) as 本期毛利率
FROM tt

显示结果:
1 dd 10.16500000000000000000
2 dda 10.16500000000000000000
3 dd22 错误
4 ddda 错误
阿三 2008-02-28
  • 打赏
  • 举报
回复
下面这样写也没有问题,你检查一下你的表数据类型吧.
SELECT [id号], [名称],
(CASE convert(numeric(16,3),[本期业务收入])
WHEN 0 THEN 0
ELSE [本期利润]/[本期业务收入]
END) as 本期毛利率
FROM tt

SELECT [id号], [名称],
(CASE isnull([本期业务收入],0)
WHEN 0 THEN 0
ELSE [本期利润]/[本期业务收入]
END) as 本期毛利率
FROM tt
fishinseaspt 2008-02-28
  • 打赏
  • 举报
回复
上个帖子发错了,是我想让isnull([本期业务收入],0)=0的值查出来显示“错误”2个字,所以遇到了数据类型转换错误。
得怎么显示字符呢

我写完后,提示“不允许数据类型从varchar 到money 的隐形转换,请用convert函数来运行此查询”为什么会提示这个?
我的写法是,[本期业务收入]有的是没填数的是空值
SELECT [id号], [名称],
(CASE isnull([本期业务收入],0)
WHEN ''错误'' THEN 0
ELSE [本期利润]/[本期业务收入]
END) as 本期毛利率
FROM _table
阿三 2008-02-28
  • 打赏
  • 举报
回复
我测试一下,没有出现你的问题


create table tt(id号 int,名称 varchar(20),本期利润 numeric(16,3),本期业务收入 numeric(16,3))

insert into tt values(1,'dd',2033,200);
insert into tt values(2,'dda',2033,200);
insert into tt values(3,'dd22',23,0);
insert into tt(id号,名称,本期利润) values(4,'ddda',2033);

SELECT [id号], [名称],
(CASE [本期业务收入]
WHEN 0 THEN 0
ELSE [本期利润]/[本期业务收入]
END) as 本期毛利率
FROM tt

1 dd 10.16500000000000000000
2 dda 10.16500000000000000000
3 dd22 .00000000000000000000
4 ddda NULL
fishinseaspt 2008-02-28
  • 打赏
  • 举报
回复
我写完后,提示“不允许数据类型从varchar 到money 的隐形转换,请用convert函数来运行此查询”为什么会提示这个?
我的写法是,[本期业务收入]有的是没填数的是空值
SELECT [id号], [名称],
(CASE isnull([本期业务收入],0)
WHEN 0 THEN 0
ELSE [本期利润]/[本期业务收入]
END) as 本期毛利率
FROM _table
dl110 2008-02-27
  • 打赏
  • 举报
回复
可以做一个陷阱,用以捕获异常:
with ADOQuery1 do
begin
close;
sql.Clear ;
sql.Add('select [id号], [名称]',);
sql.Add('[本期利润]/[本期业务收入] as 本期毛利率');
sql.Add('from _table');
try
open;
except
on e: exception do
begin
ShowMessage('ADOQuery1运行出错: '+e.Message);
... //可以加入自定义处理过程.
end;
end;
end;
jadeluo 2008-02-27
  • 打赏
  • 举报
回复
可以用CASE语句来预防除0错误, SQL语句类似于:


SELECT [id号], [名称],
(CASE [本期业务收入]
WHEN 0 THEN 0
ELSE [本期利润]/[本期业务收入]
END) as 本期毛利率
FROM _table

lihuasoft 2008-02-27
  • 打赏
  • 举报
回复
加上SQL子句:where 本期业务收入<>0

对不对?我没验证

2,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧