En uno de los proyectos que estoy desarrollando con mis alumnos necesitábamos generar algunas consultas SQL en las que obtener varios decimales como resultado de realizar determinado cálculo con el contenido de algunas columnas.
Para nuestra sorpresa y, por defecto, SQLite se empeñaba en truncar a la parte entera todos los cálculos que realizábamos.
Por fortuna, existe una forma de obtener tantos decimales como quieras en SQLite…
Si lanzamos la siguiente consulta SQL
SELECT 5/3 as MEDIA;
Observamos que se obtiene como resultado una cantidad entera obviando todos los decimales del resultado que se esperaba obtener (1,6666…)
El truco (para que realice la conversión correcta de tipos) consiste en indicar que, al menos, uno de los valores es de tipo real (y/o flotante si lo prefieres 😉 ) para lo cual añadiremos su parte decimal
NOTA: obsérvese que se ha utilizado 5.0 en lugar del 5 del ejemplo inicial (igualmente podrías haber optado por dividir entre 3.0 o multiplicar 1.0 por el 5/3 si te interesaba más por algún motivo o haber utilizado cálculos más complejos para obtener el valor final… la idea es que alguno de los valores de la expresión sea un decimal)
Redondeando el resultado
Si queremos limitar el número de cifras decimales (redondeando el resultado) deberemos hacer uso de la función printf (efectivamente, C/C++ es tu «amigo» para estas cosas) quedando la expresión de esta forma
SELECT printf(«%.2f»,5.0/3) AS MEDIA;
para obtener dos cifras decimales (2f) significativas
Conclusión
Truco en SQLite para obtener valores numéricos con tantas cifras decimales como te interesen.
Y tú…
- ¿Has tenido problemas para obtener valores decimales en SQLite?
- ¿Conocías la posibilidad de redondear valores numéricos usando la función printf()?
- ¿Conoces otra forma de obtener resultados similares?
- ¿Te interesa que sigamos publicando artículos sobre SQLite?
- …
Hola, entiendo que es necesario entender como define SQLite su lenguaje y sus tipos de datos (https://www.sqlite.org/datatype3.html).
Sqlite nos da 5 tipos de datos, dos de ellos son INTEGER y REAL, y claro las operaciones matemáticas sobre enteros y reales difieren sutilmente.
Vamos que no es lo mismo dividir sobre un conjunto de números que sobre otros. Computacionalmente es «más barato» dividir sobre «enteros», así que Sqlite cuando detecta que los datos son enteros usa la función de división sobre enteros, por «economía».
Por eso hay que convertir a real el número, para que el sistema use otra operación matemática por defecto y divida sobre números reales y no sobre enteros.
El problema está en saber que tipo de datos vamos a usar.
Por ejemplo si se define el campo de una tabla como int, al hacer un select el sistema te deberá dar el resultado como un entero y la operación que uses con estos campos será sobre el conjunto de enteros, pero si lo que necesitas es que el resultado de la operación sea «real», una de dos o defines el campo de la tabla a real o lo conviertes en el momento con alguna función de conversión.
Aquí es donde llegan las incompatibilidades en las aplicaciones de bases de datos porque Sqllite tiene unos tipos de datos, MySQL otros y cada base de datos soporta a su manera este tipo de cosas.
Si haces una aplicación innformática la construcción de la sentencia sql difiere según cada motor de base de datos y esto hace que sea complejo diseñar aplicaciones informáticas compatibles con distintos motores de bases de datos.
Un saludo.
Me gustaMe gusta
Simplemente espectacular, gracias por el apunte amigo Julio.
Como bien indicas, la gestión de los valores numéricos depende del gestor de bases de datos y, en nuestro caso, la necesidad de realizar cálculos sobre valores (que a todas luces eran enteros) surgió a posteriori debido a ciertas estadísticas que se desearon implementar.
Dejamos aquí la anotación como futura referencia y tu consejo para nuevos desarrollos que, junto a mis alumnos, vaya a desarrollar.
Muchas gracias compañero 👍
Me gustaMe gusta