Division (/) nie daje mojej odpowiedzi w postgresql


85

Mam tabeli softwarei kolumn w nim jako dev_cost, sell_cost. Jeśli dev_costto 16000 i sell_costto 7500.

Jak znaleźć ilość oprogramowania do sprzedania w celu odzyskania dev_cost?

Zapytałem jak poniżej:

select dev_cost / sell_cost from software ;

Jako odpowiedź zwraca 2. Ale musimy zdobyć 3, prawda?

Jakie byłoby zapytanie? Z góry dziękuję.


Jeśli sell_cost wynosi 7500, musimy sprzedać 3 programy, aby odzyskać dev_cost, czyli> 16000. To jest moje pytanie
zeewagon

4
spróbujselect ceil(16000::numeric/7500)
Vivek S.,

Zadziałało. Dzięki wingedpanther :)
zeewagon

1
wybierz ceil (dev_cost :: numeric / sell_cost) z oprogramowania; --pracował
zeewagon

Odpowiedzi:


144

Twoje kolumny mają typy całkowite, a dzielenie liczb całkowitych skraca wynik do zera . Aby uzyskać dokładny wynik, musisz rzutować co najmniej jedną z wartości na zmiennoprzecinkowe lub dziesiętne :

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

Lub tylko:

select dev_cost::decimal / sell_cost from software ;

Następnie możesz zaokrąglić wynik do najbliższej liczby całkowitej za pomocą ceil()funkcji:

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

(Zobacz demo na SQLFiddle .)


Mówimy o pieniądzach. Rzutuj na ułamek dziesiętny, a nie zmiennoprzecinkowy.
Mike Sherrill `` Cat Recall ''

@Mike: Słuszna uwaga, chociaż mało prawdopodobne, by miało to znaczenie w przypadku PO. (Wszystko, o co proszą, to dzielenie liczb całkowitych, które zaokrągla w górę; zmiennoprzecinkowe wystarczą do tego jako typ pośredni, przynajmniej chyba, że ​​oryginalne wartości to biginty).
Ilmari Karonen

@IlmariKaronen Dziękuję! Twoja odpowiedź mi pomogła.
MRah,

2
@MRah: Cieszę się, że mogłem pomóc. :) Przy okazji, zamiast komentować odpowiedzi, które uważasz za przydatne, możesz na nie głosować, klikając ikonę trójkąta skierowanego w górę w lewym górnym rogu odpowiedzi. Dzięki temu osoba odpowiadająca zostanie nagrodzona punktami reputacji i poinformuje ją, że jej odpowiedź jest doceniona, a także pomaga najlepszym odpowiedziom unieść się na górę strony.
Ilmari Karonen

9

Możesz rzutować typ liczb całkowitych na numerici użyć ceil()funkcji, aby uzyskać żądane wyjście

Funkcja ceil PostgreSQL zwraca najmniejszą wartość całkowitą, która jest większa lub równa liczbie.

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

Wynik:

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

Więc twoje zapytanie powinno być

select ceil(dev_cost::numeric/sell_cost) 
from software

5

Możesz również rzutować zmienną na żądany typ, a następnie zastosować dzielenie:

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

Możesz zaokrąglić swoją wartość i określić liczbę cyfr po punkcie:

SELECT TRUNC((dev_cost::numeric/sell_cost::numeric),2);

Czy istnieje realna potrzeba użycia :: decimal dla każdego operandu?
ov

1

To zapytanie zaokrągli wynik do następnej liczby całkowitej

select round(dev_cost ::decimal / sell_cost + 0.5)

Daje to nieprawidłowy wynik, jeśli dev_costjest całkowitą wielokrotnością sell_cost: patrz przykład .
Ilmari Karonen

To zapytanie jest w porządku. Ale jeśli tabela zawiera więcej wartości, na przykład dev_cost to 6000, a sell_cost to 400, odpowiedź 15 byłaby poprawna. Ale twoje zapytanie daje 16 jako odpowiedź. Co powinniśmy zrobić? Jestem nowy w SQL, popraw mnie, jeśli się mylę.
zeewagon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.