I’m trying to divide some integers to get a percentage. By default I get an integer result, of course, so I cast to decimal. But I also would like the result to only have two places to the right of the decimal.
--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
So I end up having to cast both one of the operands and the entire expression in order to get the result I want. Is there a better way to do this?
Notice I put the equation up top to signify that I am obviously not working with hardcoded numbers (i.e. Suggesting I just put “.0” after the numbers would be less than helpful). Also, I would normally leave the formatting aspect to reporting software, but this is being copied from time to time into an excel spreadsheet and I would have to hand format it every time.
When dividing a
DECIMALby anINTEGER,SQL Serveryields aDECIMALwith precision defined as p1 – s1 + s2 + max(6, s1 + p2 + 1), wheresnandpnare the scale and the precision of the 1st and 2nd arguments (the divident and the divisor).The simplest way would be:
1.is aDECIMAL(1, 0)which, being multiplied by an integer, yields aDECIMAL(n, 0). Being divided by an integer, it would then yield aDECIMAL(n, 6)(for the number orders similar to those in your example).It then needs to be cast to
DECIMAL(9, 2)to truncate the extra digits.