0

パーセンテージを取得するためにいくつかの整数を除算しようとしています。もちろん、デフォルトでは整数の結果が得られるので、10 進数にキャストします。しかし、結果の小数点以下が 2 桁だけになるようにしたいと思います。

--select (x - y) / y

select (82 - 56) / 56                                      --0
select (82 - 56) / cast(56 as decimal(9, 2))               --0.4642857142
select cast(82 - 56 as decimal(9,2)) / 56                  --0.464285
select cast((82 - 56) / 56 as decimal(9,2))                --0.00

select cast(cast(82 - 56 as decimal) / 56 as decimal(9,2)) --.46

したがって、必要な結果を得るには、オペランドの 1 つと式全体の両方をキャストする必要があります。これを行うより良い方法はありますか?

ハードコードされた数字を扱っていないことを示すために、数式を一番上に置いていることに注意してください (つまり、数字の後に ".0" を付けることを提案するのはあまり役に立ちません)。また、私は通常、書式設定の側面をレポート ソフトウェアに任せますが、これは時々 Excel スプレッドシートにコピーされるため、毎回手動で書式設定する必要があります。

4

1 に答える 1

3

DECIMALaを anINTEGERで除算すると、精度が p1 - s1 + s2 + max(6, s1 + p2 + 1) として定義される a が生成されます。ここで、SQL Serverおよびは、1 番目と 2 番目の引数 (被除数と除数) の位取りと精度です。 .DECIMALsnpn

最も簡単な方法は次のとおりです。

SELECT  CAST(1. * (x - y) / y AS DECIMAL(9, 2))

1.DECIMAL(1, 0)、整数を掛けて を生成しDECIMAL(n, 0)ます。整数で割ると、DECIMAL(n, 6)(あなたの例と同様の数の順序で)が得られます。

DECIMAL(9, 2)次に、余分な桁を切り捨てるためにキャストする必要があります。

于 2012-04-24T20:14:35.637 に答える