División (/) no da mi respuesta en postgresql

81

Tengo una tabla softwarey columnas en ella como dev_cost, sell_cost. Si dev_costes 16000 y sell_cost7500.

¿Cómo encuentro la cantidad de software que se venderá para recuperar el dev_cost?

He consultado lo siguiente:

select dev_cost / sell_cost from software ;

Devuelve 2 como respuesta. Pero necesitamos obtener 3, ¿verdad?

¿Cuál sería la consulta para eso? Gracias por adelantado.

zeewagon
fuente
Si sell_cost es 7500, necesitamos vender 3 software para recuperar dev_cost, es decir,> 16000. Esa es mi pregunta
zeewagon
4
tryselect ceil(16000::numeric/7500)
Vivek S.
Funcionó. Gracias wingedpanther :)
zeewagon
1
seleccione ceil (dev_cost :: numérico / sell_cost) del software;
zeewagon
No olvide aceptar una respuesta
Vivek S.

Respuestas:

137

Sus columnas tienen tipos enteros y la división entera trunca el resultado hacia cero . Para obtener un resultado preciso, deberá convertir al menos uno de los valores en flotante o decimal :

select cast(dev_cost as decimal) / sell_cost from software ;

o solo:

select dev_cost::decimal / sell_cost from software ;

Luego puede redondear el resultado al número entero más cercano usando la ceil()función:

select ceil(dev_cost::decimal / sell_cost) from software ;

(Vea la demostración en SQLFiddle ).

Ilmari Karonen
fuente
Hablamos de dinero. Convertido a decimal, no flotante.
Mike Sherrill 'Cat Recall'
@Mike: Buen punto, aunque es poco probable que importe en el caso del OP. (Todo lo que están pidiendo es una división de enteros que se redondea; los flotantes funcionarán bien como un tipo intermedio para eso, al menos a menos que los valores originales sean grandes). Aún así, fijo.
Ilmari Karonen
@IlmariKaronen ¡Gracias! Tu respuesta me ayudó.
MRah
2
@MRah: Me alegro de ser de ayuda. :) Por cierto, en lugar de comentar las respuestas que encuentres útiles, puedes votarlas haciendo clic en el ícono del triángulo que apunta hacia arriba en la esquina superior izquierda de la respuesta. Esto recompensará al que responde con puntos de reputación y le hará saber que su respuesta es apreciada, y también ayuda a que las mejores respuestas lleguen a la parte superior de la página.
Ilmari Karonen
8

Puede convertir el tipo entero ay numericusar la ceil()función para obtener la salida deseada

La función ceil de PostgreSQL devuelve el valor entero más pequeño que es mayor o igual a un número.

SELECT 16000::NUMERIC / 7500 col 
      ,ceil(16000::NUMERIC / 7500) 

Resultado:

col                  ceil 
------------------   ---- 
2.1333333333333333     3    

Entonces tu consulta debería ser

select ceil(dev_cost::numeric/sell_cost) 
from software
Vivek S.
fuente
4

También puede convertir su variable al tipo deseado, luego aplicar la división:

 SELECT (dev_cost::numeric/sell_cost::numeric);

Puede redondear su valor y especificar el número de dígitos después del punto:

SELECT TRUNC((dev_cost::numeric/sell_cost::numeric),2);
AdagioDev
fuente
¿Existe alguna necesidad real de usar :: decimal para cada operando?
ov
1

Esta consulta redondeará el resultado al siguiente entero

select round(dev_cost ::decimal / sell_cost + 0.5)
Abylay Sabirgaliyev
fuente
Esto dará un resultado incorrecto si dev_costresulta ser un múltiplo entero de sell_cost: ver ejemplo .
Ilmari Karonen
Esta consulta está bien. Pero si la tabla tiene más valores, digamos, por ejemplo, dev_cost es 6000 y sell_cost es 400, la respuesta 15 sería correcta. Pero su consulta da 16 como respuesta. ¿Qué debemos hacer? Soy nuevo en SQL, corrígeme si me equivoco.
zeewagon