添加SQL Server数字字段并更新另一个字段?

时间:2011-09-13 16:55:03

标签: sql sql-server

我可以在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)

例如:

  • Total_Busy_Calls = 12,Overflow_Calls = 0所以第一个结果是12
  • Total_Calls = 1000,Overflow_Calls = 12,因此第二个结果是1012
  • 计算为12/1012 = 0.0119

希望SQL Server专家可以提供帮助。

4 个答案:

答案 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);