Me animo a hacer esta entrada porque habla sobre algo simple pero que por un detalle me rompió la cabeza.
Vamos con el caso/ejemplo, tenemos una tabla Precios con tres columnas: descripción, precio y descuento. La primera es de tipo varchar, la segunda del tipo money y la tercera del tipo numeric, ya que almacena el porcentaje que descontamos sobre el precio. En la consulta queremos sacar esos tres campos y un cuarto campo calculado, el importe con el descuento aplicado. Parece que bastaría con una consulta así:
Select Descripcion, Precio, Descuento Precio * (1-Descuento/100) as ImporteConDescuento from Precios
Y ya estaría, ya tenemos nuestro importe con descuento… Pero ejecutas la consulta y ves algo raro ¿los decimales? ¿dónde están? Se está redondeando el cálculo para que devuelva un valor entero. ¿Por qué? Porque al haber operado con dos enteros en el cálculo del porcentaje el motor que realiza la consulta ha convertido el resultado a entero. Sí, así es, si operas con enteros hace una conversión a ese tipo (al menos SQL-Server 2008). Para obtener el resultado correcto tendrías que hacer así la consulta:
Select Descripcion, Precio, Descuento Precio * (1.00-Descuento/100.00) as ImporteConDescuento from Precios
Así que acuérdate de los tipos cuando uses una constante en una operación: si el resultado tiene que ser decimal usa decimales.