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 :

Comment passer d'une valeur à une autre par une formule mathématique ?


Sujet :

Langage SQL

  1. #21
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    En effet seabs, tu as raison j'avais fait une erreur dans mon message initial.

    Le résultat que je veux obtenir est bien le suivant:
    price = cost*(4,44*cost^(-0,1))

    Pouvez s'il vous plait me dire quelle formule dois-je taper dans ma requête SQL?
    Merci.

  2. #22
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Cf quelqus posts plus haut, la solution est donnée par Waldar :

    Citation Envoyé par Waldar Voir le message
    Mais comme on est sur le forum développez.com, avant de distribuer la connaissance il faut commencer par s'enquérir sur le sujet.

    Oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select power(5,-0.1) from dual;
     
    .851339922520784603355765922715152345425
    SQL-Server :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select power(cast(5 as float),-0.1);
     
    ----------------------
    0,851339922520785
    PostGreSQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select power(5,-0.1);
     
    0.8513399225207846

    Edit : ce qui dans le cas présent se met donc sous la forme basique (pour Oracle par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE laTable
       SET price = cost * 4,44 * power(cost,-0.1)

  3. #23
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    Merci à vous tous, j'essaie et je reviens vous dire.

  4. #24
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    Je suis en train d'essayer mais je ne veux pas faire de bêtise, donc je me suis mis sur une BDD de test.

    Ma table se nomme: catalog_product_flat_3
    J'ai une colonne nommée: entity_id
    Une colonne: cost
    Une colonne: price

    J'aimerais juste essayer sur un seul produit pour le moment, par exemple celui là: entity_id=896

    http://imageshack.us/photo/my-images/706/2012121419h5343.jpg/


    Donc quelle requête SQL dois-je taper?
    Merci.

  5. #25
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    J'ai vérifié, cette fois ta formule me donne bien les exemples proposés.

    Pour la requête SQL pour ton essai, elle doit être la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE NomTable SET PRICE = COST * 4.44 * Power(COST, -0.1) WHERE ENTITY_ID = 896 AND PRICE = 0 OR PRICE IS NULL
    Tu aussi passer le Entity_Id par paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE NomTable SET PRICE = COST * 4.44 * Power(COST, -0.1) WHERE ENTITY_ID = :pIndex AND PRICE = 0 OR PRICE IS NULL
    A+

  6. #26
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    Je pense qu'on est pas loin d'y arriver !! Encore merci.

    Je viens d'essayer avec cette requête SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE catalog_product_flat_3 SET PRICE = COST * 4.44 * Power(COST, -0.1) WHERE ENTITY_ID = 898 AND PRICE = 0 OR PRICE IS NULL
    Ca me retourne ce message:
    32 ligne(s) affectée(s). ( Traitement en 0.0794 sec. )
    Donc je pense que c'est bien passé, d'ailleurs je ne comprends pas pourquoi il me parle de 32 lignes affectées , alors qu'il n'y qu'une seule ligne avec entity_id=898

    Mon souci est que lorsque je vérifie après la ligne 898, le "price" n'a pas été modifié par rapport à la formule.

    Merci.

  7. #27
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    Le problème ne vient pas de la formule mais plutôt de la requête en elle même, car même en essayant une formule simple (price=cost), comme celle-ci, cela ne change pas mon "price":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE catalog_product_flat_3 SET PRICE = COST WHERE ENTITY_ID = 898 AND PRICE = 0 OR PRICE IS NULL

  8. #28
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Après contrôle ma est inexacte. Il faut certainement mettre la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (PRICE = 0 OR PRICE IS NULL)
    entre parenthèses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE catalog_product_flat_3 SET PRICE = COST * 4.44 * Power(COST, -0.1) WHERE ENTITY_ID = 898 AND (PRICE = 0 OR PRICE IS NULL)
    Pour ton essai, tu peux te limiter à la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE catalog_product_flat_3 SET PRICE = COST * 4.44 * Power(COST, -0.1) WHERE ENTITY_ID = 898
    A+

  9. #29
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    Bonsoir,

    Génial, ça a fonctionné avec cette requête SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE catalog_product_flat_3 SET PRICE = COST * 4.44 * Power(COST, -0.1) WHERE ENTITY_ID = 898
    Merci beaucoup pour ta persévérance !!

    Donc si je veux appliquer cette requête à tous mes produits, je dois donc exécuter la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE catalog_product_flat_3 SET PRICE = COST * 4.44 * Power(COST, -0.1)
    Est-ce exact?

    Maintenant j'ai encore une dernière question, dans la structure de ma table le type de "price" est en "decimal(12,4)" comment faire pour arrondir les prix tous les 0,1 car là je me retrouve avec des prix comme 19,72€ alors que j'aimerais 19,70€?

    Merci.

  10. #30
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    En fait, je viens de m'apercevoir que le prix de vente affiché sur mon site n'était pas généré dans cette table, quel con alors !!

    Mais dans cette table:


    Voilà en littéraire ce que j'aimerais interpréter en SQL:
    Je veux que "attibute_id"=99 de "entity_id"=898 soit égal à 2x "attibute_id"=100 de "entity_id"=898
    (J'ai mis 2x pour simplifier la requête, je remettrai après la formule que vous m'avez donné plus haut dans le post)

    Qui pourrait me le formuler en SQL?
    Merci.

  11. #31
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Maintenant j'ai encore une dernière question, dans la structure de ma table le type de "price" est en "decimal(12,4)" comment faire pour arrondir les prix tous les 0,1 car là je me retrouve avec des prix comme 19,72€ alors que j'aimerais 19,70€?
    L'arrondi se fait avec la commande Round.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE catalog_product_flat_3 SET PRICE = ROUND(COST * 4.44 * Power(COST, -0.1), 1) WHERE ENTITY_ID = 898
    1 = Nombre de décimale à retenir après la virgule, les autres positions sont mises à zéro.

    Pour le dernier message, je n'ai pas bien compris la question

    Je veux que "attibute_id"=99 de "entity_id"=898 soit égal à 2x "attibute_id"=100 de "entity_id"=898
    Dans cette table, tu as une colonne COST où le valeur utilisé COST se situe dans une autre table.

    Si les éléments sont dans la même table et pour des essais, tu dois utiliser le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE catalog_product_flat_3 SET PRICE = ROUND(COST * 4.44 * Power(COST, -0.1), 1) WHERE ENTITY_ID = 898 AND Attribute_ID = 99
    Attention, il s'agit Attribute_ID et non Attibute_ID comme il est écrit dans ta demande.

    Pour le ligne Attribute_Id = 100, tu feras

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE catalog_product_flat_3 SET PRICE = ROUND(COST * 4.44 * Power(COST, -0.1), 1) WHERE ENTITY_ID = 898 AND Attribute_ID = 100
    Maintenant, Price et Cost sont dans des tables différentes, le code proposé ne conviendra pas.

    En plus, tu veux calculer les prix de Entity_Id = 898 alors que ceux-ci sont déjà déterminés. Par contre, ceux de Entity_Id = 896 n'y sont pas. Là, je suis perplexe.

    Merci d'éclaircir ces points

    A+

  12. #32
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    Bonjour seabs,

    Désolé de t'embêter encore, mais je reconnais que je ne suis pas toujours clair dans mes explications, peut être que tu comprendras mieux avec cette copie d'écran de ma table:


    A savoir que le 0.75 est la valeur d'achat de mes produite, c'est moi qui entre cette valeur directement dans le back-office de mon site.
    Je veux donc que la valeur actuelle 2.01 soit calculée directement avec la formule.

    Merci.

  13. #33
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Avec le croquis, j'ai bien compris ton souhait mais au prix de quelques difficultés supplémentaires.

    Il ne serait pas possible de modifier ta table en créant une colonne Cost et une colonne Price.

    Si tu veux maintenir ta présentation, tu peux indiquer si la ligne Attribute_Id = 100 est toujours la ligne du prix d'achat et la ligne Attribute_Id = 99 celle du prix de vente.

    Avec ces informations, il sera possible d'établir le code, mais la vitesse d'exécution ne sera pas la principale qualité car il faudra inclure une sous-requête. Enfin, il n'y a que 500 prix à mettre à jour.

    A terme, il serait bien de revoir la normalisation de ta base afin de pouvoir optimiser les requêtes.

    A+

  14. #34
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    Bonsoir,

    Non je ne préfère pas toucher à la structure de ma table, ce n'est pas de mon niveau.

    Oui je te confirme que "Attribute_id = 99" correspond bien au prix de vente
    et que "Attribute_id = 100" le prix d'achat.

    Alors du coup quelle est la requête SQL pour appliquer ma formule?

    Moi qui n'y connais rien en langage SQL, voilà ce que j'ai essayé, mais forcément ça ne marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE catalog_product_entity_decimal
    SET value (WHERE attribute_id=99 AND entity_id=898)
    =
    value (WHERE attribute_id=100 AND entity_id=898) * 4.44 * Power(COST, -0.1)
    Peut être qu'avec ce code, tu vas comprendre ce que j'ai essayé de faire !!

    Merci.

  15. #35
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Je te mets le code que j'ai tester avec une base FIREBIRD car je n'ai que celle-ci sous la main. Je pense que tu utilises MySQL. Alors, il faut faire les tests car il est possible que la sous-requête ne soit pas supportée.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE catalog_product_entity_decimal C 
       SET C.PRICE =
           ROUND((SELECT COST FROM catalog_product_entity_decimal P WHERE NOT P.PRICE IS NULL AND P.attribute_id = 100 AND P.entity_id = C.entity_id) * 4.44 *
              POWER((SELECT COST FROM catalog_product_entity_decimal E WHERE NOT PRICE IS NULL AND E.attribute_id = 100 AND E.entity_id = S.entity_id), -0.1), 1)
    WHERE (C.PRICE IS NULL OR C.PRICE = 0) AND C.attribute_id = 99
    Pour faire l'essai sur le produit entity_id=898,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE catalog_product_entity_decimal C 
       SET C.PRICE =
           ROUND((SELECT COST FROM catalog_product_entity_decimal P WHERE NOT P.PRICE IS NULL AND P.attribute_id = 100 AND P.entity_id = C.entity_id) * 4.44 *
              POWER((SELECT COST FROM catalog_product_entity_decimal E WHERE NOT PRICE IS NULL AND E.attribute_id = 100 AND E.entity_id = S.entity_id), -0.1), 1)
    WHERE (C.PRICE IS NULL OR C.PRICE = 0) AND C.attribute_id = 99 AND C.entity_id = 898
    N'oublies pas de remplacer Price et Cost par le nom exact des colonnes. Il semble que Price soit en faite Value, ce qui me surprend, pour Cost, je ne sais pas mais si même colonne alors Value également

    Bon sous réserve d'aucune erreur en recopiant.

    Il y aura certainement une âme charitable pour optimiser ma requête ou l'améliorer. Au niveau performance, ce n'est pas le top

    Bon courage

    A+

  16. #36
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    Bonjour seabs,

    En tapant cette commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE catalog_product_entity_decimal C 
    SET C.value = ROUND((SELECT value FROM catalog_product_entity_decimal P WHERE NOT P.value IS NULL AND P.attribute_id = 100 AND P.entity_id = C.entity_id) * 4.44 * POWER((SELECT value FROM catalog_product_entity_decimal E WHERE NOT value IS NULL AND E.attribute_id = 100 AND E.entity_id = S.entity_id), -0.1), 1) WHERE (C.value IS NULL OR C.value = 0) AND C.attribute_id = 99 AND C.entity_id = 898
    Ca ne change rien dans ma BDD et j'ai comme réponse ce message:
    #1093 - You can't specify target table 'C' for update in FROM clause
    Merci.

  17. #37
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    Je ne connais pas MySql, mais il ne semble pas supporter le renommage des tables dans une instruction UPDATE mais seulement dans FROM.

    J'ai donc modifié le code ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE catalog_product_entity_decimal 
    SET value = 
      ROUND((SELECT value FROM catalog_product_entity_decimal P WHERE NOT P.value IS NULL AND P.attribute_id = 100 AND catalog_product_entity_decimal.entity_id = P.entity_id) * 4.44 * 
        POWER((SELECT value FROM catalog_product_entity_decimal E WHERE NOT E.value IS NULL AND E.attribute_id = 100 AND catalog_product_entity_decimal.entity_id = E.entity_id), -0.1), 1) 
    	WHERE (value IS NULL OR value = 0) AND attribute_id = 99 AND entity_id = 898
    Fait un essai, personnellement je n'ai pas le temps d'installer MySQL pour vérifier.

    A+

  18. #38
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Pourquoi ne pas passer par une requête du genre:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    insert into catalog_product_entity_decimal
    (attribute_id,entity_id,value)
    select 99,898,value * 4.44 * Power(COST, -0.1)
    from catalog_product_entity_decimal
    where value is not null and attribut_id = 100 and entity_id = 898
    update duplicates
    Il faut bien sur l'adapter, car j'avoue que je n'ai pas trop compris où se trouve COST dans la base.

    Tatayo.

  19. #39
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    En fait il n'y a pas de valeur COST dans cette table.
    Mais le prix d'achat de mon article est la ligne attribute_id=100
    Par exemple pour le produit entity_id=898, sa valeur d'achat est de 0,75€.

    Merci, mais je ne voudrais pas trop modifier la structure de ma table.

  20. #40
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Avec ma requête tu n'as pas à modifier la structure de la base.
    Si j'ai bien compris, tu veux calculer la valeur de Value pour la table catalog_product_entity_decimal dont attribut_id = 99 et product_id = 898, à partir de Value de la même table, mais avec attribut_id = 99 et product_id = 898.
    La formule de calcul est value * 4.44 * power(value,-0.1).
    La requête devient:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO catalog_product_entity_decimal
    (attribute_id,entity_id,value)
    SELECT 99,898,value * 4.44 * Power(value, -0.1)
    FROM catalog_product_entity_decimal
    WHERE value IS NOT NULL AND attribut_id = 100 AND entity_id = 898
    UPDATE duplicates

    Avec une seule requête je mets à jour les lignes existantes, et je crée les lignes manquantes. Reste à voir si MySql accepte "update duplicates".

    Tatayo.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/02/2014, 09h15
  2. affecter une valeur à un id par une fonction
    Par schwarzy2 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 17/03/2008, 09h51
  3. Réponses: 4
    Dernier message: 06/07/2007, 13h57
  4. Réponses: 2
    Dernier message: 08/10/2006, 11h44

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