2011-09-13 68 views
1

我可以在MS-Access(它工作)中做到这一点,但需要SQL Server 2000中的等效功能。所有字段都位于同一个表中(tbl_Toll_Free_Final)。 Percent_Busy是一个十进制(18,5),其他是整数。添加SQL Server数字字段并更新另一个字段?

我试过这个,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

试试这个:

UPDATE dbo.tbl_Toll_Free_Final 
SET Percent_Busy = 
    (Total_Busy_Calls + Overflow_Calls)/
    CAST((Total_Calls + Overflow_Calls) AS DECIMAL(18,5)) 

您将与整数而忽略小数,余数,分数等。通过铸造除数为十进制整数,就避免这个整数除法。

+0

谢谢Ben!简单和工作就像一个魅力! – Rob

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

现在它会一直是最新的...只需要一些零除的条件逻辑。

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 
) 
相关问题