Division (/) không đưa ra câu trả lời của tôi trong postgresql


81

Tôi có một bảng softwarevà cột trong nó như là dev_cost, sell_cost. Nếu dev_costlà 16000 và sell_costlà 7500.

Làm cách nào để tìm số lượng phần mềm được bán để khôi phục dev_cost?

Tôi đã truy vấn như sau:

select dev_cost / sell_cost from software ;

Nó đang trả về 2 là câu trả lời. Nhưng chúng ta cần lấy 3, phải không?

Truy vấn cho điều đó sẽ là gì? Cảm ơn trước.


Nếu sell_cost là 7500, chúng tôi cần phải bán 3 phần mềm để phục hồi dev_cost tức> 16000. Đó là câu hỏi của tôi
zeewagon

4
thửselect ceil(16000::numeric/7500)
Vivek S.

Nó đã làm việc. Cảm ơn wingpanther :)
zeewagon

1
chọn ceil (dev_cost :: numeric / sell_cost) từ phần mềm; --worked
zeewagon

Câu trả lời:


137

Các cột của bạn có kiểu số nguyên và phép chia số nguyên cắt ngắn kết quả về không . Để nhận được kết quả chính xác, bạn sẽ cần phải truyền ít nhất một trong các giá trị thành số thực hoặc số thập phân :

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

hoặc chỉ:

select dev_cost::decimal / sell_cost from software ;

Sau đó, bạn có thể làm tròn kết quả đến số nguyên gần nhất bằng cách sử dụng ceil()hàm:

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

(Xem bản demo trên SQLFiddle .)


Chúng ta đang nói về tiền. Truyền sang thập phân, không trôi.
Mike Sherrill 'Cat Recall'

@Mike: Điểm tốt, mặc dù không có vấn đề gì trong trường hợp của OP. (Tất cả những gì họ yêu cầu là phép chia số nguyên làm tròn; float sẽ hoạt động tốt như một kiểu trung gian cho điều đó, ít nhất là trừ khi các giá trị ban đầu là bigints.) Tuy nhiên, cố định.
Ilmari Karonen

@IlmariKaronen Cảm ơn bạn! Câu trả lời của bạn đã giúp tôi.
MRah

2
@MRah: Rất vui khi được hỗ trợ. :) BTW, thay vì bình luận về các câu trả lời mà bạn thấy hữu ích, bạn có thể bình chọn chúng bằng cách nhấp vào biểu tượng hình tam giác hướng lên ở góc trên cùng bên trái của câu trả lời. Điều này sẽ thưởng điểm danh tiếng cho người trả lời và cho họ biết rằng câu trả lời của họ được đánh giá cao, đồng thời nó cũng giúp những câu trả lời hay nhất lên đầu trang.
Ilmari Karonen

8

Bạn có thể ép kiểu số nguyên đến numericvà sử dụng ceil()hàm để nhận được kết quả đầu ra mong muốn

Hàm ceil PostgreSQL trả về giá trị số nguyên nhỏ nhất lớn hơn hoặc bằng một số.

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

Kết quả:

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

Vì vậy, truy vấn của bạn nên

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

4

Bạn cũng có thể truyền biến của mình thành kiểu mong muốn, sau đó áp dụng phép chia:

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

Bạn có thể làm tròn giá trị của mình và chỉ định số chữ số sau điểm:

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

Có thực sự cần sử dụng :: decimal cho mỗi toán hạng không?
ov

1

Truy vấn này sẽ làm tròn kết quả thành số nguyên tiếp theo

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

Điều này sẽ cho kết quả sai nếu dev_costtình cờ là bội số nguyên của sell_cost: xem ví dụ .
Ilmari Karonen

Truy vấn này là ok. Nhưng nếu bảng nhiều giá trị hơn, chẳng hạn như dev_cost là 6000 và sell_cost là 400, thì câu trả lời 15 sẽ đúng. Nhưng truy vấn của bạn đưa ra câu trả lời là 16. Chúng ta nên làm gì? Tôi mới sử dụng SQL, hãy sửa cho tôi nếu tôi sai.
zeewagon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.