Trabajar con porcentajes en SQL-Server: evitar conversión a entero.

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.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s