Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/10/2011, 10h27   #1
Invité régulier
 
Développeur informatique
Inscription : mars 2007
Messages : 12
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2007
Messages : 12
Points : 9
Points : 9
Par défaut Utilisation variable/alias (SQL) dans requet

Bonjour,

Connaitriez vous un moyen d'utiliser une variable déclaré dans un select et réutiliser dans le même select ?

j'ai lu la doc MySQL

http://http://dev.mysql.com/doc/refm...variables.html

Mais cela ne m'aide pas ...

Citation:
....
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nom_de_table HAVING b=5;

La raison est que @aa ne contiendra pas la valeur de la ligne courante, mais celle de id pour la dernière ligne acceptée.

La règle générale est de ne jamais assigner et utiliser la même variable dans la même commande. ......
Voici ma requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
SELECT 
  (case when(a.remise_p <> '') then(SELECT politique_commerciale_remises.remise FROM politique_commerciale_remises WHERE((politique_commerciale_remises.id = a.remise_p) AND(politique_commerciale_remises.id_pc = d.id_pc))) else a.remise1 end) AS pourcent_remise,
  (a.prix_p * a.qte) AS prix_total_hors_remise,
  (a.prix_p - ((a.prix_p * (case when(a.remise_p <> '') then(SELECT politique_commerciale_remises.remise FROM politique_commerciale_remises WHERE((politique_commerciale_remises.id = a.remise_p) AND(politique_commerciale_remises.id_pc = d.id_pc))) else a.remise1 end)) / 100)) AS pu_avec_remise,
  ((a.prix_p - ((a.prix_p * (case when(a.remise_p <> '') then(SELECT politique_commerciale_remises.remise FROM politique_commerciale_remises WHERE((politique_commerciale_remises.id = a.remise_p) AND(politique_commerciale_remises.id_pc = d.id_pc))) else a.remise1 end)) / 100)) * a.qte) AS prix_total_ligne,
  a.id,
  a.qte,
  d.id_commercial,
  a.ordre,
  concat(ucfirst(h.usr_titre), _latin1' ', ucfirst(h.usr_nom), _latin1' ', ucfirst(h.usr_prenom)) AS nom_commercial,
  d.id_mag,
  g.libelle AS nom_mag,
  d.id_societe,
  f.libelle AS nom_societe,
  a.commentaire_bdc_lignes,
  a.id_bdc,
  d.id_pc,
  a.remise_p AS id_remise_pc,
  a.id_emplacement,
  b.libelle AS nom_emplacement,
  a.id_format,
  c.libelle AS nom_format,
  a.remise1,
  a.remise2,
  e.remise AS nom_remise_pc,
  a.prix_p,
  a.total_ht,
  a.emplacement_rigeur,
  a.no_semaine,
  a.annee,
  a.`status`,
  i.id AS id_avoir,
  i.status_avoir_lignes,
  a.groupe
FROM
  bdc_lignes a
  LEFT OUTER JOIN bdc_emplacements_listes b ON (a.id_emplacement = b.id)
  LEFT OUTER JOIN bdc_formats_listes c ON (a.id_format = c.id)
  LEFT OUTER JOIN bdc d ON (a.id_bdc = d.id_bdc)
  LEFT OUTER JOIN politique_commerciale_remises e ON (a.remise_p = e.id)
  LEFT OUTER JOIN societes f ON (d.id_societe = f.id)
  LEFT OUTER JOIN liste_mag g ON (d.id_mag = g.id)
  LEFT OUTER JOIN utilisateurs h ON (d.id_commercial = h.usr_id)
  LEFT OUTER JOIN avoirs_lignes i ON (i.id_bdc_lignes = a.id)
J'aimerais pouvoir réutiliser facilement par exemple :

Code :
1
2
 
  (case when(a.remise_p <> '') then(SELECT politique_commerciale_remises.remise FROM politique_commerciale_remises WHERE((politique_commerciale_remises.id = a.remise_p) AND(politique_commerciale_remises.id_pc = d.id_pc))) else a.remise1 end) AS pourcent_remise
Pour calculer d'autre valeur (comme rajouter une remise etc ...), mais je suis obligé de reprendre toute la ligne.

Pouvoir créer une variable contenant l'information (numérique) m'aiderais bien (j'imagine que je ne suis pas le seul).

Merci de votre aide
caledonien est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 09h38   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
En essayant de simplifier ta requête, j'ai trouvé une bizarrerie.

Avec la requête se trouvant dans les CASE :
Code :
1
2
3
4
SELECT politique_commerciale_remises.remise 
FROM politique_commerciale_remises 
WHERE politique_commerciale_remises.id = a.remise_p   
  AND politique_commerciale_remises.id_pc = d.id_pc
On peut faire le MCD suivant :
a (bdc_lignes) -n,m----associer----o,p- politique_commerciale_remises
d (bdc) -q,r----associer----s,t------------------------------------|

Je suppose que "bdc" veut dire "bon de commande" et que "bdc_lignes" contient les lignes de commandes ?

Avec les jointures de la requête principale :
Code :
1
2
3
4
FROM
  bdc_lignes a
  LEFT OUTER JOIN bdc d ON (a.id_bdc = d.id_bdc)
  LEFT OUTER JOIN politique_commerciale_remises e ON (a.remise_p = e.id)
On déduit le MCD suivant :
a (bdc_lignes) -1,1----contenir----1,n- d (bdc)
|--------------------u,v----associer----w,x- e (politique_commerciale_remises)

Il y a donc dans ta requête :
- 1 association entre "politique_commerciale_remises" et le bon de commande "bdc" via la colonne "id_pc" (que représente t-elle ?)
- 1 association entre la ligne du bon de commande "bdc_lignes" et "politique_commerciale_remises" via les colonnes (bdc_lignes.remise_p = politique_commerciale_remises.id)
Autrement dit, la "politique_commerciale_remises" associée au bon de commande n'est pas forcément la même que celle associée à la ligne de commande.
Normal ?

Je te donne quand même le début de ma simplification qui prend en compte les associations des requêtes figurant dans les CASE.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
	CASE
		WHEN a.remise_p <> '' THEN pcr.remise
		ELSE a.remise1 
	END AS pourcent_remise,
	a.prix_p * a.qte AS prix_total_hors_remise,
	CASE
		WHEN a.remise_p <> '' THEN a.prix_p - ((a.prix_p * pcr.remise) / 100)
		ELSE a.prix_p - ((a.prix_p * a.remise1) / 100)
	END AS pu_avec_remise,
	CASE
		WHEN a.remise_p <> '' THEN (a.prix_p - ((a.prix_p * pcr.remise) / 100)) * a.qte
		ELSE (a.prix_p - ((a.prix_p * a.remise1) / 100)) * a.qte
	END AS prix_total_ligne,
	a.id, a.qte
	-- A compléter
FROM bdc_lignes a
LEFT OUTER JOIN politique_commerciale_remises pcr ON pcr.id = a.remise_p
	LEFT OUTER JOIN bdc d ON pcr.id_pc = d.id_pc
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h48.


 
 
 
 
Partenaires

Hébergement Web