私たちは子供の頃から数字を丸めるように教えられてきました。 1.15を10分の1に四捨五入すると、1.2または1.1になりますか? SQL ROUND関数を使用して応答すると、混乱する可能性があります。後で、私が何を意味するかがわかります。
[sendpulse-form id =” 12010”]
別の質問があります。 1 + 1の合計は何ですか?それはかなりばかげた質問です。初めて数学を学ぶ子供向けであり、私たち大人向けではありません。ただし、以下のコードをご覧ください:
-- Variables for input values
DECLARE @value1 DECIMAL(3,2) = 1.05
DECLARE @value2 DECIMAL(3,2) = 1.45
DECLARE @sum1 DECIMAL(3,2) = @value1 + @value2
-- Variables for rounded values
DECLARE @roundedValue1 TINYINT = ROUND(@value1,0)
DECLARE @roundedvalue2 TINYINT = ROUND(@value2,0)
DECLARE @sum2 TINYINT = ROUND(@sum1,0)
-- Surprise!
SELECT 'sum of ' + CAST(@value1 AS VARCHAR(4)) + ' + ' + CAST(@value2 AS VARCHAR(4)) AS Q1, @sum1 AS Sum1
SELECT 'sum of ' + CAST(@roundedValue1 AS VARCHAR(4)) + ' + ' + CAST(@roundedValue2 AS VARCHAR(4)) AS Q2, @sum2 AS Sum2
次に、以下の結果を確認します。
ここで何が起こったのですか?小数部で2つの値を取得します。次に、SQLROUNDを使用してそれらを最も近い整数に丸めます。それらの合計も丸められます。しかし、どうすれば1 + 1を3にすることができますか?!
鋭い目を持つSQLプロは、コードの問題をすぐに見つけます。しかし、これを考慮してください:
- 2.5を最も近い整数に四捨五入すると、2ではなく3になります。
- 1+1の合計は2です。
大変ですね。
ここがポイントです。注意しないと、SQLROUNDで問題が発生する可能性があります。これは、開発者と会計士の間の議論の源にもなり得ます。これらの1つは、マテリアリティの原則を扱う場合です。議論は醜くなる可能性があります。
何ができますか?
SQLServerのラウンド関数
いいえ、この問題を次の開発者に渡すように言っているのではありません。この投稿では、あなたとあなたのユーザーの両方が結果に満足するための典型的なヒントを提供します。これらのヒントの一部は、アプリのフロントエンド側またはレポートでの数値の丸めにも適用できます。
5つのヒントを詳しく確認しましょう。
SQLの数値の丸め関数
SQLで数値を四捨五入する方法をすでに知っているので、なぜ質問するのですか?方法を尋ねることではありません。それはいつ尋ねることについてです。以下と同様の質問をすることができます:
- 計算を行う前に入力値を四捨五入しますか?
- または、入力値を計算してから、結果を四捨五入しますか?
実行する計算によっては、さらに多くの質問が発生する可能性があります。
重要なのは、ユーザーから四捨五入の標準またはモデルを取得するかどうかです。次に、このモデルを使用してクエリを記述できます。後で意見の不一致につながると想定したり推測したりすることはありません。また、この標準をレポートのどこかにメモとして含めることが役立つ場合は、それを実行してください。
標準のもう1つの部分は、使用する小数点以下の桁数です。テーブル列のデータ型がDECIMAL(10,4)の場合はどうなりますか?小数点以下2桁のみに丸めるにはどうすればよいですか?
以下のコードを試してください:
DECLARE @value DECIMAL(10,4)
SET @value = 8346.1556
-- This will result in 8346.16 instead of 8346.1600
SELECT CAST(ROUND(@value, 2) AS DECIMAL(10,2))
ROUNDの後のCASTは、小数点以下2桁のみを表示します。 2つのゼロは切り捨てられます:
理解 SQLを小数点以下の桁数に丸める方法
ここで最初の質問に答えます。 1.15を10分の1に四捨五入すると、1.2または1.1になりますか?
まず、DECIMALデータ型でチェックします:
DECLARE @value DECIMAL(3,2)
SET @value = 1.15
SELECT @value
SELECT ROUND(@value, 1) -- This will result in 1.2 or 1.20
上記のコードの結果は1.20または1.2です:
しかし、データ型がFLOATの場合はどうでしょうか。変更してみましょう。
DECLARE @value FLOAT
SET @value = 1.15
SELECT @value
SELECT ROUND(@value, 1) -- This will result to 1.1
結果はどうなりますか? 1.1です。自分の目で確かめてください:
私があなたにもっと疑問を与えたいということではありません。ただし、これらのデータ型は両方とも数値に使用されますが、同じように作成されていないことを知っておく必要があります 。
- FLOATとREALは概算の数値であり、丸めにはお勧めしません。WHERE句の等価性チェックにも使用できません。
- DECIMALとNUMERICの精度とスケールは固定されており、正確な数値と呼びます。したがって、1.15を10分の1に四捨五入すると、正解は1.2になります。
- 整数も正確な数値です。数字全体を四捨五入しても安全です。
ジレンマはテーブルのデザインから始まります。どこかで丸められるFLOATまたはREAL列について何かをしたいと思うかもしれません。
3。一貫性を保つために同じデータソースでSQLROUNDを使用する
さまざまな詳細を表示するために、いくつかの収益レポートを作成する必要があると想定します。要約、タイプ別の詳細な内訳、およびソース別の詳細な内訳です。これら3つのレポートはすべて、セントまたは小数部分を重要ではないものとして扱います。したがって、値を整数に丸めることは避けられません。
3つのレポートすべてで一貫した結果を得るには、以下を適用します。
- 同じベーステーブルから選択して、詳細からの合計が要約と一致していることを確認します。
- 四捨五入には同じモデルを使用します(上記のポイント#1)
これらの収益レポートでユーザーに満足してもらいたいですか?どこでどのように番号を取得するかについて一貫性を保ちます。
4。 SQL フロア または 天井 VS ラウンド
次の整数に切り上げまたは切り下げなければならない場合があります。この場合、ROUND()の代わりにCEILING()またはFLOOR()が適切な選択です
CEILING()は、値を次の整数に切り上げます:
SELECT CEILING(1); -- returns 1
SELECT CEILING(1.6); -- returns 2
SELECT CEILING(1.4); -- returns 2
一方、FLOOR()は切り捨てられます:
SELECT FLOOR(1); -- returns 1
SELECT FLOOR(2.1); -- returns 2
SELECT FLOOR(2.9); -- returns 2
5。ユーザーと結果をテストする
すべてのクエリとレポートのデザインを完了したら、最後の部分はユーザーとの作業を確認することです。どんなに上手くても、どんなに一生懸命働いても、間違いを犯す可能性があります。場合によっては、正しく実行するためにさらに数回の反復が必要になります。
ユーザーには、レポートの正確性を保証するテストシナリオがあります。または、Excelファイルを手動で作成して、自分の作業と比較することもできます。いずれにせよ、より良いシステムのために彼らと協力してください。喜んでいただけます。
結論
SQL ROUNDの操作は、難しい場合があります。ただし、ここで紹介するヒントは、これらのハードルに勝つことができることを証明しています。何を学びましたか?
- ユーザーに標準またはモデルの四捨五入を依頼してください。
- 使用しているデータ型を把握してください。
- 一貫性を保つために、同じデータソースでROUNDを使用します。
- 場合によっては、ROUNDよりもFLOORまたはCEILINGの方が適切な場合があります。
- 最後に、ユーザーと結果をテストします。
この投稿は役に立ちましたか?それがあなたのためなら、他の人もそれを必要とするかもしれません。この投稿をお気に入りのソーシャルメディアで共有してください。
関連記事
- SQLServerでOVER句とPARTITIONBY句を使用して現在の合計を計算する
- TransactSQLを使用して中央値を計算する