2012-06-19 25 views
14

Sorgularımdan birinde AVG işlevinin bir int döndüğü anlaşılıyor.SQL AVG bir int dönüyor

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

Kayan nokta değerlerini döndürmek için nasıl alabilirim? Onu yayınlamaya çalıştım ama avg_level için tüm satırlarım hala tamsayıydı.

+1

AVG() işlevinin tamsayılar üzerindeki davranışı ANSI standardında tanımlanmamıştır. Bazı veritabanları bir tamsayı döndürür; Diğer veritabanları bir float döndürür. Bir float almak için açık bir cast/convert kullanabilirsiniz. Ya da, yaptığım şey sadece 1.0 ile çarpıyor. –

cevap

26

böyle yapmak için deneyin:

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

Ayrıca ben bazı başka yaklaşım bulabilirsiniz this konu buldum ama değil, kullanılan ve tam olarak işler olup olmadığını bilmiyorum.

+3

@CodeKingPlusPlus - Sanırım CAST (AVG (alan) AS FLOAT) 'ı denediniz mi? '' AVG (alan) 'yine aynı cevabı geri döndürecektir, ki bu bir INT'dir, bu kez bir FLOAT'a dökmek size yardım etmeyecektir. AVG (CAST (AS FLOAT)), ancak, çok farklı ve muhtemelen ne istediğinizi. * [Bu cevaptan + 1] * – MatBailie

+0

@Dems evet, haklısınız, aynı görünüyor ama değil. – Sajmon

1

Döküm daha kesin, ancak ...AVG(1.0 * e.employee_level)... da bunu yapabilir ve daha okunaklı olabilir.

+3

RDBMS'ye bağlıdır. AFAIK birçok RDBMS, bir FLOAT değil, sabit bir nokta NUMERIC değeri olarak '1.0' davranır. Benzer etki, muhtemelen bu dava için daha iyi, ama tamamen aynı değil. Bu nedenle, kodumda açık CAST/CONVERT kullanmayı tercih ediyorum. Ardından, veri türü sıkıntısına ve örtük dönüşümlere dayanmak yerine, hangi veri türünün şeyler olduğunu * bilirsiniz. – MatBailie

İlgili konular