2012-06-19 13 views
14

W jednym z moich zapytań okazuje się, że funkcja AVG zwraca int.SQL AVG zwracający int

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

Jak uzyskać to, aby zwracać wartości zmiennoprzecinkowe? Próbowałem rzucić to, ale wszystkie moje wiersze dla avg_level były nadal liczbami całkowitymi.

+1

Zachowanie funkcji AVG() na liczbach całkowitych nie jest zdefiniowane w standardzie ANSI. Niektóre bazy danych zwracają liczbę całkowitą; inne bazy danych zwracają zmienną. Aby uzyskać płynność, możesz użyć wyraźnej obsady/konwersji. Lub, co robię, to pomnożenie przez 1.0. –

Odpowiedz

26

Spróbuj zrobić to tak:

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

Również znalazłem this temat gdzie można znaleźć trochę innego podejścia, ale nie wykorzystał i nie wiem dokładnie, czy działa, czy nie.

+3

@CodeKingPlusPlus - Chyba próbowałeś 'CAST (AVG (field) AS FLOAT)? 'AVG (field)' nadal będzie zwracać tę samą odpowiedź, która jest INT, przez którą czas rzucania jej na FLOAT nie pomoże ci. 'AVG (CAST (pole AS FLOAT)) jest jednak bardzo różne i prawdopodobnie tego, co chcesz. * [+ 1 do tej odpowiedzi] * – MatBailie

+0

@Dzie tak, prawda, wydaje się to samo, ale nie jest. – Sajmon

1

Odlewanie jest bardziej pewne, ale może to zrobić również i może być bardziej czytelne.

+3

To zależy od RDBMS. AFAIK wiele RDBMS traktuje "1.0" jako stałą wartość NUMERIC, a nie FLOAT. Podobny efekt, być może nawet lepszy w tym przypadku, ale nie do końca taki sam. Z tego powodu preferuję jawny CAST/CONVERT w moim kodzie. Wtedy * wiesz * jakie są typy danych, zamiast polegać na prekondencji typu danych i niejawnych konwersjach. – MatBailie

Powiązane problemy