1
votes

Existe-t-il une fonction ROUNDDOWN () dans SQL comme dans EXCEL

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 :


1
votes

Il existe une fonction FLOOR , qui peut être adaptée à votre cas d'utilisation:

SELECT FLOOR(value * 100) / 100 AS RoundedValue


0 commentaires


2
votes

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.

DB Fiddle

https://www.ibm.com /support/knowledgecenter/en/SSEPEK_10.0.0/sqlref/src/tpc/db2z_bif_truncate.html

https://www.w3schools.com/sql/func_sqlserver_floor.asp


6 commentaires

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.



1
votes

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 ().


0 commentaires

0
votes

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


0 commentaires