2017-12-11 12 views
0

実際の金額の1.00以内にある金額列をどのように照会しますか?

たとえば、AmountPaid = 7.75の場合は、金額が6.75 - 8.75の範囲ですべての結果を返します。

あなたが交換またはでキーワードとすべきである

Where (vc.AmountPaid >= med.Payment - 1.00 or vc.amountpaid <= med.Payment + 1.00) 
+1

Where(v.AmountPaid med.Payment - 1.00とmed.Payment + 1.00の間) –

答えて

0

...私は、単純な何かを見下ろすています知っているが、今のように、私は次のコードを持っています。この

Where (vc.AmountPaid >= med.Payment - 1.00 AND vc.amountpaid <= med.Payment + 1.00) 
1
Where (vc.AmountPaid between med.Payment - 1.00 and med.Payment + 1.00) 
0

あなたはABS機能を見下ろすされているような

何か。

あなたが探しているものを取得するための最も簡単な方法は次のようになり

where abs(AmountPaid-payment) <= 1 

私は数値の違いを扱っていたときにABSが良いです。 (あなたが/コピーSSMSにペーストして実行するだけでできること)この例2.注:10と12、および12と10の間の差は同じである

declare @yourdata table (AmountPaid money, Payment money); 
insert @yourdata values (50.00, 49.12),(100, 100.91),(25,1000),(10,20); 

select AmountPaid, Payment, diff = abs(AmountPaid-payment) 
from @yourdata 
where abs(AmountPaid-payment) <= 1; 

戻り

AmountPaid   Payment    diff 
--------------------- --------------------- --------------------- 
50.00     49.12     0.88 
100.00    100.91    0.91 
+1

これは表面上正しいのですが、そのような方法でABS関数を使用することで、クエリを非sargableにしました。ここに良い記事があります(https://blog.bertwagner.com/how-to-search-and-destroy-non-sargable-queries-on-your-server-ff9f57c7268e)。 –

+0

@ Katherine Elizabeth Lightsey - 私が投稿したのは、「表面上正しい」だけではなく、コアには正しいものです。 SARGabilityの欠如は、これが良い学習機会をもたらしたハウツーの質問であったため、投票を構成してはならない。さらに、私のソリューションはインデックス付きビューに変わる可能性があるため、SARGabilityはもはや問題にはなりません。 –

関連する問題