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

Requêtes MySQL Discussion :

Utilisation variable/alias (SQL) dans requet


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 15
    Points
    15
    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 ...

    ....
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 801
    Points : 34 053
    Points
    34 053
    Billets dans le blog
    14
    Par défaut
    En essayant de simplifier ta requête, j'ai trouvé une bizarrerie.

    Avec la requête se trouvant dans les CASE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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

Discussions similaires

  1. Utiliser une variable PL/SQL dans une requête
    Par maxwell86 dans le forum PL/SQL
    Réponses: 2
    Dernier message: 10/12/2008, 09h34
  2. Utilisation procedure pl/sql dans requete sql
    Par KNIZOU dans le forum PL/SQL
    Réponses: 20
    Dernier message: 10/04/2008, 11h36
  3. Utiliser du code SQL dans VBA
    Par a2line dans le forum Requêtes et SQL.
    Réponses: 25
    Dernier message: 30/05/2006, 14h53
  4. Projet VB v6 : utilisation de requête SQL dans mon code
    Par MITCH31 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/10/2005, 15h02
  5. [PL/SQL] Utilisation table PL/SQL dans clause IN
    Par Yorglaa dans le forum PL/SQL
    Réponses: 13
    Dernier message: 05/10/2004, 10h36

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