2011-09-13 9 views
1

私はMS-Accessでこれを行うことができますが、それは機能しますが、SQL Server 2000では同等の機能が必要です。すべてのフィールドは同じテーブル(tbl_Toll_Free_Final)にあります。 Percent_Busyは10進数(18,5)で、その他は整数です。SQL Serverの数値フィールドを追加し、別のフィールドを更新しますか?

これを試しましたが、Percent_Busyは0に更新されています。Total_Busy_CallsまたはOverflow_Callsは0になる可能性がありますが、おそらくdivで0のエラーですが、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第1の結果が12
  • Total_Calls = 1000、Overflow_Calls = 12従って第2の結果であり、計算は12である1012
  • /1012 = 0.0119

ご希望のSQL Server担当者がお手伝いします。

答えて

4

これを試してください:あなたは10進数、除数をキャストすることによって、小数、余り、画分などを無視する整数整数を分割している

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

、あなたはこの整数の除算を避けます。

+0

ありがとうございました!シンプルで魅力的な作品! – 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

問題は、整数を整数で区切って整数にし、10進数のフィールドに格納することです。

小数点以下の桁数を強制するには、オペランドの1つを10進数に変換する必要があります。

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 
) 
関連する問題