Disons que j'ai un tableau qui comporte deux colonnes, à savoir Quantité et Pourcentages où mes pourcentages sont en décimales. Maintenant, je veux multiplier ces deux colonnes et arrondir la valeur à 2 décimales. Arrondir ici signifie que tous les nombres de 1 à 9 sont arrondis vers le bas. Existe-t-il une fonction intégrée dans SQL pour le faire comme dans Excel?
Exemples:
13.567 should round to 13.56 136.7834 should round to 136.78 0.7699 should round to 0.76
J'ai essayé de rechercher une telle fonction en ligne mais je n'ai pas pu venir à travers une solution appropriée.
5 Réponses :
Il existe une fonction FLOOR , qui peut être adaptée à votre cas d'utilisation:
SELECT FLOOR(value * 100) / 100 AS RoundedValue
oui il y a des fonctions dans sql pour round
ex:
SELECT ProductName, Price, FlOOR(Price) AS RoundedPrice
FROM Products;
Essayez d'utiliser des hyperliens au lieu de liens directs
Cela n’arrondit pas vers le bas , mais simplement - essayez-le
utilisez 0 au lieu de 2 vérifiez-le
Comprenez-vous «arrondi»? 0 l'arrondit simplement à zéro virgule décimale - essayez ROUND (135.6, 0) - qu'obtenez-vous? 136, non? Pas ce que le PO demande.
Vous pouvez utiliser TRUNCATE () pour cet arrondi
select round(123.456, 2, 1) as rounddown
ou
SELECT Floor(135.675); //for integer rounding, like 135
Vous pouvez également utiliser
select TRUNCATE(2.847, 2) as rounddown
Le 3ème paramètre étant non nul provoquera une troncature après le nombre de décimales spécifié dans le 2ème paramètre.
https://www.ibm.com /support/knowledgecenter/en/SSEPEK_10.0.0/sqlref/src/tpc/db2z_bif_truncate.html
L'OP doit spécifier le nombre de décimales à arrondir; Je ne pense pas que Floor accepte un tel paramètre
L'OP cherchait une solution dans MySQL, pas dans SqlServer. De plus, cette fonction n'arrondit pas à deux décimales, comme vous pouvez le voir dans votre violon
Dans mysql 8, il s'exécute avec succès. vérifier
@Shaikot J'ai édité la question avec quelques exemples de ce que devrait être le résultat. Essayez-le avec ces valeurs - toute version de mySQL - Floor ne peut pas être utilisé pour accomplir cela sans maths supplémentaires, selon ma réponse.
Votre réponse est également erronée et je la vérifie maintenant dans mysql 8. quand je réponds à cette question, c'était différent. merci pour le modifier et l'effacer. alors vous pouvez utiliser TRUNCATE ()
J'ai suggéré une modification pour votre réponse, car elle est maintenant correcte, mais un peu floue. J'ai également supprimé mon vote défavorable. Btw, ma réponse renvoie des résultats corrects, mais le vôtre est meilleur, car le mien utilise les mathématiques pour obtenir ce qui est déjà disponible via des fonctions intégrées.
La solution au problème est de tronquer la décimale supplémentaire qui peut être obtenue en utilisant le paramètre supplémentaire de la fonction ROUND qui est ROUND (nombre, décimal_places, 0/1). Ici, si le dernier paramètre est autre que 0, il tronquera plutôt que l'arrondi, ce qui équivaut à la fonction ROUNDDOWN () d'Excel que je recherchais.
Vous pouvez également utiliser la fonction TRUNCATE (), en passant le nombre de décimales à conserver comme deuxième paramètre, ce qui supprimera toutes les décimales supplémentaires, agissant comme une fonction ROUNDDOWN ().
J'espère que cet utilitaire d'arrondi aidera quelqu'un:
CREATE FUNCTION `get_round`(val DOUBLE, nDigits INT, RoundStyle VARCHAR(255)) RETURNS double
NO SQL
BEGIN
DECLARE a DOUBLE DEFAULT 0;
SET nDigits = ifnull(nDigits, 0);
CASE
WHEN UCASE(RoundStyle) IN ('ROUND NEAREST','', 'NEAREST', '', 'RND','ROUND', 'DEFAULT','DFLT', null) THEN #normal rounding, but up from 10.50#
SET a = round(val, nDigits);
WHEN UCASE(RoundStyle) IN('ROUND UP', 'UP') THEN #ROUND 10.554 to 10.56
SET a = ceil(val * (power(10, nDigits) )) / (power(10, nDigits));
WHEN UCASE(RoundStyle) IN('ROUND DOWN', 'DOWN') THEN #ROUND 10.555 to 10.55
SET a = truncate(val, nDigits) ;
WHEN UCASE(RoundStyle) IN('ROUND BANKER', 'BANKER','BANKERS ROUNDING') THEN #ROUND TO THE NEAREST EVEN 10.555 is 10.56 and 10.565 is 10.56
SET a = IF(ABS(val - TRUNCATE(val, nDigits)) * POWER(10, nDigits + 1) = 5
AND NOT CONVERT(TRUNCATE(ABS(val) * POWER(10, nDigits), 0), UNSIGNED) % 2 = 1,
TRUNCATE(val, nDigits), ROUND(val, nDigits));
WHEN UCASE(RoundStyle) IN('ROUND UP INTEGER', 'INT UP','UP INT') THEN #10.4 rounds to 11.0
SET a = ceiling(val);
WHEN UCASE(RoundStyle) IN('ROUND DOWN INTEGER', 'INT DOWN','DOWN INT') THEN #10.6 rounds to 10.0
SET a = floor(val);
END CASE;
RETURN ifnull(a, 0);
END
C'est tout dans le fantastique manuel qui vaut la peine d'être lu .
Double possible de Comment arrondir à l'entier inférieur le plus proche dans MySQL? < / a>
@MuhammadWaheed n'est pas un doublon, car cette question traite de l'arrondi de la virgule décimale, pas des entiers.
Merci @CoolBots d'avoir compris la question. La fonction générale ROUND () arrondit les valeurs de 0 à 4 comme une valeur ci-dessous et les valeurs 5 à 9 comme une valeur ci-dessus. La fonction générale FLOOR () donne une valeur sans les décimales. Ce que je veux, c'est que, disons que mon nombre est 2,3456, il devrait être arrondi à 3 décimales comme 2,345 et non 2,346.
La solution au problème est de tronquer la décimale supplémentaire qui peut être obtenue en utilisant le paramètre supplémentaire de la fonction ROUND qui est ROUND (nombre, décimal_places, 0/1). Ici, si le dernier paramètre est autre que 0, il tronquera plutôt que l'arrondi, ce qui équivaut à la fonction ROUNDDOWN () d'Excel que je recherchais.