IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[T-SQL] Créer fonction d'arrondi spécifique


Sujet :

Langage SQL

  1. #1
    Membre du Club Avatar de d1g-2-d1g
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 127
    Points : 68
    Points
    68
    Par défaut [T-SQL] Créer fonction d'arrondi spécifique
    Bonjour,

    j'ai une requête qui me retourne des données brut et je voudrais faire un traitement sur une des colones. En fait je voudrait pouvoir arrondir la colone "prix" au 50 centime le plus proche. C'est à dire que 5,75 devient 5,50 et 5,76 devient 6,00.

    Pour cela j'ai pensé créer une fonction me permettant de faire cet arrondi mais les fonctions déjà intégrées à SQL Server que je connai ne me permettent pas de créer cette fonction spécifique.

    Quelqu'un peut m'aider ?

    Merci d'avance

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Voici un algo pour une fonction qui me paraît tenir la route :

    Soit X le nombre à arrondir :
    - tu multiplies ton nombre par 2 (Y = 2*X),
    - grâce aux fonctions CEILING et FLOOR, tu détermines quel est l'entier le plus proche de Y (IF CEILING(Y) - Y>= Y - FLOOR(Y) ...),
    - tu divises le resultat par 2, et tu obtiens la valeur souhaitée.

    PS : ça n'est pas du SQL à proprement parler, donc pour des problèmes sur le codage de fonctions, je pense qu'il est préférable de poster sur le forum dédié au SGBD
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Réponse plus générale : arrondi à x près :

    ROUND(Valeur/x)*x.

    Il est clair qu'ici diviser par 0,50 ou multiplier par 2 c'est pareil.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  4. #4
    Membre du Club Avatar de d1g-2-d1g
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 127
    Points : 68
    Points
    68
    Par défaut
    ok merci les gars j'ai réussi a faire quelque chose qui fonctionne

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par d1g-2-d1g
    C'est à dire que 5,75 devient 5,50 et 5,76 devient 6,00.
    Citation Envoyé par pgibone
    ROUND(Valeur/x)*x.
    Round est "presque" la solution, mais cette fonction arrondi les 1/2 entiers à l'entier supérieur, ce qui ne correspond pas à la demande ... d'ou l'utilité de bricoler une petite UDF.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> select round(2*5.75)/2 from dual;
     
    ROUND(2*5.75)/2
    ---------------
                  6
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Xo
    Citation Envoyé par pgibone
    ROUND(Valeur/x)*x.
    Round est "presque" la solution, mais cette fonction arrondi les 1/2 entiers à l'entier supérieur, ce qui ne correspond pas à la demande ... d'ou l'utilité de bricoler une petite UDF.
    Tu n'as pas bien lu, et pour reprendre l'exemple de départ, je ne vois pas de différence entre
    ROUND(5.75*2)/2
    et
    ROUND(5.75/0.5)*0.5, qui est l'application de ma formule générale au cas x = 0.50, et re
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  7. #7
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par pgibone
    Tu n'as pas bien lu, et pour reprendre l'exemple de départ, je ne vois pas de différence entre
    ROUND(5.75*2)/2
    et
    ROUND(5.75/0.5)*0.5, qui est l'application de ma formule générale au cas x = 0.50, et re
    Si, je t'assure, j'ai lu, relu et vérifié. Mais notre ami voulait qu'avec une valeur de 5,75 en entrée, la fonction lui retourne 5,50 et non 6. Or :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> select round(5.75/0.5)*0.5 from dual;
     
    ROUND(5.75/0.5)*0.5
    -------------------
                      6
    D'ou mon intervention précédente
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Ce n'est qu'une question de définition de ROUND (d'ailleurs arrondir 0.5 à la valeur inférieure n'est pas logique, répartition différente), et dans ce cas un simple
    ROUND(Valeur/x - .0000005)*x devrait convenir
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  9. #9
    Membre du Club Avatar de d1g-2-d1g
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 127
    Points : 68
    Points
    68
    Par défaut
    Ne vous emballez pas les gars

    De toute facon j'ai trouvé quelque chose qui fonctionne...

    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    CREATE FUNCTION arrondir_prix_achat (@prix_achat money)  
    RETURNS  money  AS  
    BEGIN
    	DECLARE @prix_achat_arrondi money
    	DECLARE @prix_entier money
    	DECLARE @prix_decimal money
     
    	SET @prix_entier = FLOOR(@prix_achat)
    	SET @prix_decimal = @prix_achat - @prix_entier
     
    	IF @prix_decimal < 0.25
    		SET @prix_achat_arrondi = @prix_entier
    	ELSE IF @prix_decimal < 0.75
    		SET @prix_achat_arrondi = @prix_entier + 0.5
    	ELSE
    		SET @prix_achat_arrondi = @prix_entier + 1
     
    	RETURN (@prix_achat_arrondi)
    END
    merci quand même...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Requête SQL avec sélection de dates spécifiques et fonction iif
    Par luckytiger dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 04/03/2010, 11h08
  2. SQL Server / Fonction définie par l'utilisateur
    Par borgfabr dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/03/2005, 15h14
  3. [Export Données] [SQL] Créer un script d'export de données
    Par Tueur_a_gage dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/03/2005, 14h31
  4. [SQL] commande pour l'arrondi à l'entier superieur
    Par seb.briet dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/01/2005, 15h36
  5. [SQL] Combiner fonction d'agrégation et DISTINCT .
    Par p@radox dans le forum Langage SQL
    Réponses: 5
    Dernier message: 02/12/2004, 17h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo