Abteilung (/) gibt meine Antwort nicht in postgresql

81

Ich habe eine Tabelle softwareund Spalten darin als dev_cost, sell_cost. Wenn dev_costist 16000 und sell_costist 7500.

Wie finde ich die Menge der zu verkaufenden Software, um die wiederherzustellen dev_cost?

Ich habe wie folgt abgefragt:

select dev_cost / sell_cost from software ;

Es gibt 2 als Antwort zurück. Aber wir müssen 3 bekommen, oder?

Was wäre die Abfrage dafür? Danke im Voraus.

Zeewagon
quelle
Wenn sell_cost 7500 ist, müssen wir 3 Software verkaufen, um dev_cost wiederherzustellen, dh> 16000. Das ist meine Frage
zeewagon
4
versuchen Sieselect ceil(16000::numeric/7500)
Vivek S.
Es funktionierte. Danke wingedpanther :)
zeewagon
1
Wählen Sie Ceil (dev_cost :: numeric / sell_cost) aus der Software aus. --worked
zeewagon
Vergessen Sie nicht , eine Antwort anzunehmen
Vivek S.

Antworten:

137

Ihre Spalten haben Ganzzahltypen, und die Ganzzahldivision schneidet das Ergebnis gegen Null ab . Um ein genaues Ergebnis zu erhalten, müssen Sie mindestens einen der Werte in Gleitkomma- oder Dezimalwerte umwandeln :

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

oder nur:

select dev_cost::decimal / sell_cost from software ;

Anschließend können Sie das Ergebnis mit der folgenden ceil()Funktion auf die nächste Ganzzahl aufrunden :

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

(Siehe Demo zu SQLFiddle .)

Ilmari Karonen
quelle
Wir reden über Geld. Auf Dezimalstelle umwandeln, nicht schweben.
Mike Sherrill 'Cat Recall'
@ Mike: Guter Punkt, obwohl es im Fall des OP unwahrscheinlich ist, dass er eine Rolle spielt. (Alles, was sie verlangen, ist eine Ganzzahldivision, die aufgerundet wird. Floats eignen sich gut als Zwischentyp, zumindest wenn die ursprünglichen Werte keine Bigints sind.) Trotzdem behoben.
Ilmari Karonen
@IlmariKaronen Danke! Ihre Antwort hat mir geholfen.
MRah
2
@ Mrah: Ich bin froh, Ihnen behilflich zu sein. :) Übrigens, anstatt Antworten zu kommentieren, die Sie nützlich finden, können Sie sie abstimmen, indem Sie auf das nach oben weisende Dreiecksymbol in der oberen linken Ecke der Antwort klicken. Dies belohnt den Antwortenden mit Reputationspunkten und lässt ihn wissen, dass seine Antwort geschätzt wird, und es hilft
Ilmari Karonen
8

Sie können den Integer-Typ in numericdie ceil()Funktion umwandeln und die gewünschte Ausgabe verwenden

Die PostgreSQL-Ceil-Funktion gibt den kleinsten ganzzahligen Wert zurück, der größer oder gleich einer Zahl ist.

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

Ergebnis:

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

So sollte Ihre Anfrage sein

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

Sie können Ihre Variable auch in den gewünschten Typ umwandeln und dann die Division anwenden:

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

Sie können Ihren Wert runden und die Anzahl der Stellen nach dem Punkt angeben:

SELECT TRUNC((dev_cost::numeric/sell_cost::numeric),2);
AdagioDev
quelle
Muss für jeden Operanden wirklich :: decimal verwendet werden?
ov
1

Diese Abfrage rundet das Ergebnis auf die nächste Ganzzahl

select round(dev_cost ::decimal / sell_cost + 0.5)
Abylay Sabirgaliyev
quelle
Dies führt dev_costzu einem falschen Ergebnis, wenn es sich um ein ganzzahliges Vielfaches von handelt sell_cost: siehe Beispiel .
Ilmari Karonen
Diese Abfrage ist in Ordnung. Wenn die Tabelle jedoch mehr Werte enthält, z. B. dev_cost 6000 und sell_cost 400, ist die Antwort 15 korrekt. Aber Ihre Anfrage gibt 16 als Antwort. Was sollen wir machen? Ich bin neu in SQL, korrigieren Sie mich, wenn ich falsch liege.
Zeewagon