2012-06-19 26 views
14

Trong một trong các truy vấn của tôi, có vẻ như hàm AVG trả về một int.SQL AVG trả về số int

select ..., AVG(e.employee_level)avg_level 

Làm cách nào để lấy lại giá trị dấu phẩy động? Tôi đã thử đúc nó nhưng tất cả các hàng của tôi cho avg_level vẫn là số nguyên.

+1

Hành vi của hàm AVG() trên các số nguyên không được xác định trong tiêu chuẩn ANSI. Một số cơ sở dữ liệu trả về một số nguyên; cơ sở dữ liệu khác trả về một phao. Để có được một float bạn có thể sử dụng một diễn viên/chuyển đổi rõ ràng. Hoặc, những gì tôi làm chỉ đơn giản là nhân với 1.0. –

Trả lời

26

Cố gắng làm điều đó như thế này:

AVG(Cast(e.employee_level as Float)) as avg_level 

Ngoài ra tôi thấy this chủ đề nơi bạn có thể tìm thấy một số cách tiếp cận khác, nhưng tôi không sử dụng nó và không biết chính xác liệu công trình hay không.

+3

@CodeKingPlusPlus - Tôi đoán bạn đã thử 'CAST (AVG (trường) AS FLOAT)'? 'AVG (field)' sẽ vẫn trả về cùng một câu trả lời, đó là một INT, do đó thời gian đúc nó thành một FLOAT sẽ không giúp bạn. 'AVG (CAST (trường AS FLOAT))', tuy nhiên, là rất khác nhau, và có lẽ những gì bạn muốn. * [+ 1 cho câu trả lời này] * – MatBailie

+0

@ Dường có, bạn nói đúng, nó có vẻ giống nhau nhưng không. – Sajmon

1

Đúc chắc chắn hơn, nhưng ...AVG(1.0 * e.employee_level)... cũng có thể làm điều đó và có thể dễ đọc hơn.

+3

Nó phụ thuộc vào RDBMS. AFAIK nhiều RDBMS xử lý '1.0' như một giá trị điểm cố định NUMERIC, không phải là FLOAT. Hiệu ứng tương tự, thậm chí có thể tốt hơn cho trường hợp này, nhưng không hoàn toàn giống nhau. Vì lý do này, tôi có xu hướng thích CAST/CONVERT rõ ràng hơn trong mã của tôi. Sau đó, bạn * biết * loại dữ liệu nào là thứ, thay vì dựa vào tỷ lệ loại dữ liệu và chuyển đổi tiềm ẩn. – MatBailie

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