2012-01-17 6 views
19

Pracuję nad witryną, która wymaga od mnie wyświetlenia wykresu średniej liczby dziennych danych wejściowych użytkownika. Mam już kwerendy SQL, która zwraca te informacje do mnie:Wybieranie/rzutowanie danych wyjściowych jako liczba całkowita w SQL

SELECT sum(number)/count(number) as average, date FROM stats WHERE * GROUP BY date 

To daje mi wynik szukam, ale wynik jest podawany z dokładnością trzech miejsc po przecinku. Chcę zaokrąglić tę liczbę. Mógłbym to zrobić w PHP lub moim silniku szablonów, ale byłem ciekawy, czy istnieje sposób na zrobienie tego wszystkiego w bazie danych.

Czy istnieje sposób przesyłania danych wyjściowych jako liczbę całkowitą (w MySQL)?

+3

Z ciekawości, z dowolnego powodu, z którego nie korzystasz [funkcja AVG] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_avg)? –

+0

@jimmy_keen nie miał pojęcia, że ​​istnieje! Czy jest jakiś powód, aby go użyć? (lepszy, szybszy, silniejszy?) – MrGlass

+1

@MrGlass - Bardziej zwięzły i unika możliwych problemów z dzieleniem przez zero w innych RDBMS (AFAIK MySQL zwraca "NULL" na zasadzie podziału przez zero) –

Odpowiedz

28
SELECT 
    CAST(sum(number)/count(number) as UNSIGNED) as average, 
    date 
FROM stats 
WHERE * 
GROUP BY date 
+6

-1. Jeśli użyjesz "INT" jako typu, otrzymasz błąd. Dostępne typy dla CAST/CONVERT można zobaczyć w dokumentacji http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_convert – Corneliu

+1

To ma znaczenie? Podejście jest odpowiedzią na Q. –

+0

@Corneliu i spróbowałem 'INT' bez błędu. – alex

1
SELECT convert(int, sum(number)/count(number)) as average, 
    date 
FROM stats 
WHERE * GROUP BY date 

lub

SELECT 
    CAST(sum(number)/count(number) as INT) as average, 
    date 
FROM stats 
WHERE * 
GROUP BY date 
5

jak o użyciu MySQL FORMAT funkcji?

mysql> SELECT FORMAT(12345.123456, 4); 
+-------------------------+ 
| FORMAT(12345.123456, 4) | 
+-------------------------+ 
| 12,345.1235    | 
+-------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT FORMAT(12345.123456, 0); 
+-------------------------+ 
| FORMAT(12345.123456, 0) | 
+-------------------------+ 
| 12,345     | 
+-------------------------+ 
1 row in set (0.00 sec) 
+0

to działa dla mnie. –

17

Dopuszczalne wartości dla CAST w MySQL są następujące

  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]

Więc można użyć

SELECT CAST(sum(number)/count(number) AS UNSIGNED) as average... 

Albo SIGNED jeśli SUM część może zawsze sumują się do liczby ujemnej.

4

Użyj DIV operator.

mysql> SELECT 5 DIV 2; 
    -> 2 

całkowita dzielenie. Podobne do FLOOR(), ale jest bezpieczne z wartościami BIGINT. Niepoprawne wyniki mogą wystąpić w przypadku nieoczekiwanych operacji przekraczających zakres BIGINT.