2017-05-04 7 views
0

データ型nvarchar(50)の2つの列AとBがある場合、両方とも通貨コード(例:100.00 USD)の金額を表します。トリガーや手続きの計算で小数点のみを使用しますか?計算で文字列の小数部を使用するSQL Server

AS

... :例えば

、A = '300.00 USD' およびB = '299.50 USD' A、Bからの値を減算した後、挿入トリガー@a nvarchar(50)を宣言します。

declare @b nvarchar(50);

declare @ans decimal(10,2);

@ i = i.Aを挿入iから選択します。

挿入iからBを選択します。 @b -

は今、私は@ans = @aを見つけたい

を開始します。

END

それは私が「を選択して、異なるテーブルと出力を結合する値の範囲、テストのための手順でそれをやっている実際のシナリオの一部である複雑に何

。 。 "へ。次のコードのように

+1

通貨を別の列に保管しないのはなぜですか? –

+0

小数点データにはテキストフィールドを使用しないでください。問題はSQL Serverではなくクエリです。 * text *で数学演算を行うにはどうしますか?通貨が関与しているオペレーションは実行しないでください。 *ドル*から*ポンド*を差し引くポイントは何ですか? –

+0

それは理想的でしょう。残念ながら、これは大学プロジェクトのためのものであり、正規化を守らなければなりません。特定のテーブルは予約のためのもので、私は合計価格を計算しようとしています。3番目の正規形では、非プライム属性が別の非プライム属性に依存することはできません。これは、通貨を別の列に格納する場合です。 – Nazgul

答えて

1

通貨は正確に3文字である場合、あなたは最後の4を切り落とすことができます。

select cast(left(val, len(val) - 4) as decimal(10, 2)) 

それとも、あなたが最初のスペースを使用することができます。

select cast(left(val, charindex(' ', val)) as decimal(10, 2)) 

私は通貨の値を格納する、より一般的な方法は、2つの列、「お金」や「小数」として1を使用していることを追加する必要がありますし、もう1つは通貨コードです。金銭的価値を文字列として保存することを奨励する唯一の時間は、固定小数点小数フィールドをサポートしていないデータベースです。

right()を使用して通貨コードを取得できます。

+0

ありがとう!私は別々の列を持つことに同意しますが、3NFは私の場合に遵守しなければなりません。通貨コードはテーブルのPKに依存しません。 – Nazgul

1

使用Convert & Replace機能: -

declare @a nvarchar(50); 

declare @b nvarchar(50); 

declare @ans decimal(10,2); 

set @a = '300.00 USD' 
set @B = '299.50 USD' 

set @ans = convert(decimal(10,2),replace(@a,'USD','')) - 
      convert(decimal(10,2),replace(@b,'USD','')) 

select @ans 

結果: -

0.50 
+0

'' 1000 USD ' - ' 500 GBP ''切捨てによって文が実行される可能性がありますが、結果が間違っている可能性があります。 –

+0

ええ、別のところで述べたように通貨換算を使用します。これは単なる非常に単純な例でした。 – Nazgul

関連する問題