Précédent   Forum du club des développeurs et IT Pro > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/12/2012, 15h37   #41
seabs
Membre chevronné
 
Inscription : janvier 2009
Messages : 395
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 395
Points : 633
Points : 633
Bonjour,

Si tes essais ne sont pas satisfaisants avec la requête de @tatayo, tu pourras essayer celle ci-dessous.

Comme tu peux le voir, je l'ai simplifié.

Code :
1
2
3
4
UPDATE catalog_product_entity_decimal
  SET Value = (SELECT ROUND(Value * 4.44 * POWER(Value, -0.1), 1) FROM catalog_product_entity_decimal C
                 WHERE C.attribut_id = 100 AND catalog_product_entity_decimal.entity_id = C.entity_id)
WHERE (Value IS NULL OR Value = 0) AND attribut_id = 99 AND entity_id = 898
Pour mettre à jour la totalité de base, il conviendra simplement de retirer la partie de code
Il faut noter si elle supporter par ta base, la requête de @tatayo est plus satisfaisante car elle permet de faire des insertions ni nécessaire.

A+
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 20h11   #42
guillaume7684
Invité de passage
 
Inscription : juin 2007
Messages : 73
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 73
Points : 4
Points : 4
Citation:
Envoyé par tatayo Voir le message
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 :
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.
Bonsoir,

Avec cette requête:
Code :
1
2
3
4
5
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 attribute_id = 100 AND entity_id = 898
Ca me retourne:
Citation:
#1062 - Duplicate entry '898-99-0' for key 2
Merci.
guillaume7684 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 20h13   #43
guillaume7684
Invité de passage
 
Inscription : juin 2007
Messages : 73
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 73
Points : 4
Points : 4
Citation:
Envoyé par seabs Voir le message
Bonjour,

Si tes essais ne sont pas satisfaisants avec la requête de @tatayo, tu pourras essayer celle ci-dessous.

Comme tu peux le voir, je l'ai simplifié.

Code :
1
2
3
4
UPDATE catalog_product_entity_decimal
  SET Value = (SELECT ROUND(Value * 4.44 * POWER(Value, -0.1), 1) FROM catalog_product_entity_decimal C
                 WHERE C.attribut_id = 100 AND catalog_product_entity_decimal.entity_id = C.entity_id)
WHERE (Value IS NULL OR Value = 0) AND attribut_id = 99 AND entity_id = 898
Pour mettre à jour la totalité de base, il conviendra simplement de retirer la partie de code
Il faut noter si elle supporter par ta base, la requête de @tatayo est plus satisfaisante car elle permet de faire des insertions ni nécessaire.

A+

Bonsoir,

Avec cette requête:
Code :
1
2
3
4
UPDATE catalog_product_entity_decimal
  SET Value = (SELECT ROUND(Value * 4.44 * POWER(Value, -0.1), 1) FROM catalog_product_entity_decimal C
                 WHERE C.attribut_id = 100 AND catalog_product_entity_decimal.entity_id = C.entity_id)
WHERE (Value IS NULL OR Value = 0) AND attribute_id = 99 AND entity_id = 898
Ca me retourne:
Citation:
#1093 - You can't specify target table 'catalog_product_entity_decimal' for update in FROM clause
Merci.
guillaume7684 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 20h55   #44
tatayo
Expert Confirmé
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 537
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 537
Points : 3 068
Points : 3 068
Citation:
Envoyé par guillaume7684 Voir le message
Bonsoir,

Avec cette requête:
Code SQL :
1
2
3
4
5
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 attribute_id = 100 AND entity_id = 898

Ca me retourne:


Merci.
Il manque la ligne "update duplicates" à la fin de la requête, à moins que mySql ne le supporte pas.
Si c'est le cas une solution est de supprimer la ligne correspondant avant l'insertion, le tout bien sur dans ue transaction.

Tatayo.
tatayo est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 07h40   #45
seabs
Membre chevronné
 
Inscription : janvier 2009
Messages : 395
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 395
Points : 633
Points : 633
Bonjour,

As-tu réussi à réaliser les tests et à calculer les prix de vente ?

Sinon, tu peux nous confirmer que la base de données installée est bien MySQL ainsi que le n° de version.

Si c'est le cas, je vais l'installer sur mon ordinateur personnel et faire des tests pour résoudre ton problème.

A+
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 12h09   #46
mike76
Invité régulier
 
Inscription : avril 2009
Messages : 13
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 13
Points : 6
Points : 6
pour éviter le problème
#1093 - You can't specify target table 'catalog_product_entity_decimal' for update in FROM clause

lié à MySql, il faut faire des sous-requêtes comme ci-dessous :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UPDATE catalog_product_entity_decimal C1
SET C1.value = Round( 	
                      ( 
				(SELECT value FROM ( SELECT * FROM catalog_product_entity_decimal) AS C2
				WHERE C2.entity_id=C1.entity_id
				AND C2.attribute_id=100)
				* 4.44 
                                * Power(
					(SELECT value FROM ( SELECT * FROM catalog_product_entity_decimal) AS C3
					WHERE C3.entity_id=C1.entity_id
					AND C3.attribute_id=100), 
				-0.1)
                    )
              ,1)
WHERE C1.attribute_id=99;
mike76 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/12/2012, 13h51   #47
seabs
Membre chevronné
 
Inscription : janvier 2009
Messages : 395
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 395
Points : 633
Points : 633
Bonjour,

@mike76
Citation:
pour éviter le problème
#1093 - You can't specify target table 'catalog_product_entity_decimal' for update in FROM clause
As-tu fait des essais ?

J'avais donné le code ci-après
Code :
1
2
3
4
5
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
Après la modification des noms de colonnes, @guillaume7684 m'avait indiqué l'erreur ci-dessus.

Il est vrai ta requête est différente, alors peut être la solution.

Je ne connais pas MySql suffisamment pour résoudre la difficulté.

Il reste plus qu'à attendre le retour de @guillaume7684

A+
seabs est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/12/2012, 18h47   #48
guillaume7684
Invité de passage
 
Inscription : juin 2007
Messages : 73
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 73
Points : 4
Points : 4
Merci mike76 ta solution marche nickel !!!

Merci à tous pour votre participation.
guillaume7684 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h13.


 
 
 
 
Partenaires

Hébergement Web