2012-02-23 32 views
14

Tôi có truy vấn này:Chuyển đổi INT nổi trong SQL

SELECT sl.sms_prefix, sum(sl.parts) , cp.country_name, CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4)) 
FROM sms_log sl, sms_transaction st, country_prefix cp 
WHERE st.customer_id =1 
AND st.sendtime >=1329865200 
AND st.sendtime <=1330037999 
AND st.sms_trans_id = sl.trans_id 
AND sl.sms_prefix = cp.prefix 
AND st.customer_id = cp.customer_id 
GROUP BY sl.sms_prefix 
LIMIT 0 , 30 

Kết quả:

sms_prefix sum(sl.parts)  country_name price total 
================================================================================== 
45   2      Denmark 0.01 0.019999999552965 
63   3      Philippines 2 6 

Như bạn thấy "total" là không đúng cho Denmarksum(sl.parts)=2 Multiply với 0.01 tổng nên được 0.02 .

Trường giá là FLOAT cách tôi có thể TẮT tổng số để nổi?

Kính trọng,

Trả lời

19

Trong oracle db có một trick cho đúc int nổi (Tôi cho rằng, nó cũng nên làm việc trong mysql):

select myintfield + 0.0 as myfloatfield from mytable 
+0

Cảm ơn heximal, thành công, vui lòng xem những thay đổi ở các bài bản gốc – alkhader

+1

đừng quên về ưu tiên phép tính số học, số tiền có ưu tiên thấp hơn nhân . (sum (sl.parts) +0.0) * cp.price sẽ chính xác hơn. – heximal

+0

Có, tôi cần SUM xảy ra trước khi nhân – alkhader

28

Trong khi @ công trình câu trả lời Heximal, tôi don' T cá nhân đề nghị nó.

Điều này là do nó sử dụng imlicit truyền. Mặc dù bạn không nhập CAST, hoặc SUM() hoặc 0.0 cần phải được truyền sang cùng loại dữ liệu, trước khi + có thể xảy ra. Trong trường hợp này thứ tự ưu tiên có lợi cho bạn, và bạn nhận được một phao trên cả hai mặt, và một phao là kết quả của +. Nhưng SUM(aFloatField) + 0 không mang lại INT, bởi vì 0 đang được ngụ ý truyền sang FLOAT.

Tôi thấy rằng trong hầu hết các trường hợp lập trình, sẽ thích hợp hơn là rõ ràng. Đừng để mọi thứ có cơ hội, nhầm lẫn hoặc giải thích.

Nếu bạn muốn rõ ràng, tôi sẽ sử dụng như sau.

CAST(SUM(sl.parts) AS FLOAT) * cp.price 


tôi sẽ không thảo luận xem NUMERIC hoặc float (điểm cố định, thay vì dấu chấm động) là thích hợp hơn, khi nói đến lỗi rouding, vv Tôi sẽ chỉ cho phép bạn google mà nếu bạn cần, nhưng FLOAT quá ồ ạt sử dụng sai, có rất nhiều điều để đọc về chủ đề đã có.

Bạn có thể thử cách sau để xem những gì sẽ xảy ra ...

CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4)) 
+0

Cảm ơn Dems, khi tôi thử CAST (SUM (sl.parts) AS NUMERIC (10,4)) * CAST (cp.price AS NUMERIC (10,4)), nó cung cấp cú pháp đúng cú pháp cú pháp để sử dụng gần 'FLOAT) – alkhader

+0

@alkhader - Đoạn mã của bạn không bao gồm từ 'FLOAT' - vì vậy bạn cần hiển thị phần còn lại của truy vấn. Nó có thể chỉ là một thiếu ')' hoặc ',' từ một câu lệnh trước. – MatBailie

+0

Thanks Dems, tôi đã cập nhật POST ban đầu của mình với truy vấn tôi đã sử dụng. – alkhader

Các vấn đề liên quan