web-dev-qa-db-fra.com

Sélection / conversion de la sortie sous forme d'entier dans SQL

Je travaille sur un site qui me demande d'afficher un graphique du nombre moyen par jour d'une entrée utilisateur. J'ai déjà une requête SQL qui me renvoie ces informations:

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

Cela me donne le résultat que je recherche, mais le résultat est donné avec une précision de trois décimales. Je veux arrondir ce nombre. Je pouvais le faire dans PHP ou mon moteur de modèle, bien sûr, mais j'étais curieux de savoir s'il y avait un moyen de tout faire dans la base de données.

Existe-t-il un moyen de convertir une sortie sous forme d'entier (dans MySQL)?

24
MrGlass
SELECT 
  CAST(sum(number)/count(number) as UNSIGNED) as average, 
  date 
FROM stats 
WHERE * 
GROUP BY date
35
Oleg Dok

Les types valides pour un CAST dans MySQL sont les suivants

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

Vous pouvez donc utiliser

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

Ou SIGNED si la partie SUM peut un jour correspondre à un nombre négatif.

20
Martin Smith

que diriez-vous d'utiliser MySQL FORMAT Function?

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)
6
John Woo

Utilisez DIV opérateur .

mysql> SELECT 5 DIV 2;
    -> 2

Division entière. Similaire à FLOOR (), mais est sûr avec les valeurs BIGINT. Des résultats incorrects peuvent se produire pour les opérandes non entiers qui dépassent la plage BIGINT.

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

ou

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