我可以在MS-Access中执行此操作(并且可以正常工作)但需要SQL Server 2000中的等效项。所有字段都位于同一个表中(tbl_Toll_Free_Final
)。 Percent_Busy
是十进制(18,5),其他是整数。
我试过这个并且Percent_Busy更新为0. Total_Busy_Calls或Overflow_Calls可以是0所以它可能是一个div为零的错误,但SQL服务器不会报告任何错误。
UPDATE dbo.tbl_Toll_Free_Final
SET Percent_Busy =
(Total_Busy_Calls + Overflow_Calls) / (Total_Calls + Overflow_Calls)
例如:
希望SQL Server专家可以提供帮助。
答案 0 :(得分:4)
试试这个:
UPDATE dbo.tbl_Toll_Free_Final
SET Percent_Busy =
(Total_Busy_Calls + Overflow_Calls) /
CAST((Total_Calls + Overflow_Calls) AS DECIMAL(18,5))
您将整数除以整数,忽略小数,余数,分数等。通过将除数转换为小数,可以避免此整数除法。
答案 1 :(得分:1)
没有理由为此使用手动更新...还要注意* 1.0以避免整数数学运算。每次添加或更新行时,您是否要运行更新语句?
ALTER TABLE dbo.tbl_Toll_Free_Final DROP COLUMN Percent_Busy;
GO
ALTER TABLE dbo.tbl_Toll_Free_Final ADD Percent_Busy AS
(
CONVERT(DECIMAL(18,5),
(Total_Busy_Calls + Overflow_Calls)*1.0 / (Total_Calls + Overflow_Calls))
);
现在它总是最新的...只需要一些条件逻辑来除以零。
答案 2 :(得分:1)
你遇到的问题是用整数除以整数,得到一个整数,然后存储在你的十进制字段中。
您需要将其中一个操作数转换为十进制以强制进行十进制除法。
UPDATE dbo.tbl_Toll_Free_Final
SET Percent_Busy =
convert(decimal(18,5), Total_Busy_Calls + Overflow_Calls) /
convert(decimal(18,5), Total_Calls + Overflow_Calls)
添加对除零问题的检查:
UPDATE dbo.tbl_Toll_Free_Final
SET Percent_Busy =
case
when Total_Calls + Overflow_Calls = 0 then 0
else
convert(decimal(18,5), Total_Busy_Calls + Overflow_Calls) /
convert(decimal(18,5), Total_Calls + Overflow_Calls)
end
拥有此更新语句的另一种方法是将列设置为计算字段,以便“动态”生成列数据。 (首先删除现有列)
alter table dbo.tbl_Toll_Free_Final
add Percent_Busy AS (
case
when Total_Calls + Overflow_Calls = 0 then 0
else
convert(decimal(18,5), Total_Busy_Calls + Overflow_Calls) /
convert(decimal(18,5), Total_Calls + Overflow_Calls)
end
)
答案 3 :(得分:0)
这是因为你正在进行整数除法而不使用浮点数。由于结果将是百分比(范围在0.0和1.0之间),整数除法结果将始终为0)。请尝试更改为SELECT
,以便查看结果:
SELECT *,
(Total_Busy_Calls + Overflow_Calls) / ((Total_Calls + Overflow_Calls) * 1.0)
FROM dbo.tbl_Toll_Free_Final;
UPDATE
声明为:
UPDATE dbo.tbl_Toll_Free_Final
SET Percent_Busy =
(Total_Busy_Calls + Overflow_Calls) / ((Total_Calls + Overflow_Calls) * 1.0);