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 :

Fusionner des requêtes


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Fusionner des requêtes
    Bonjour,

    J'ai 3 requêtes qui sont presque les mêmes, ce qui change sont quelques condition dans le Where, serai t il possible de fusionner ces 3 requêtes pour n'en faire qu'une seule ?

    Les voiçi donc :

    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
     
    select ddv.NOM_DDV, ca_gecaprod.DOM_VENTE, sum(ca_gecaprod.CA_MOIS) as CA_CUM_N1
    from ca_gecaprod,client,vendeur,rdv,ddv
    where ca_gecaprod.ID_CLT = client.ID_CLT and client.VL = vendeur.NOM_VENDEUR and vendeur.ID_RDV = rdv.ID_RDV and rdv.ID_DDV = ddv.ID_DDV and ca_gecaprod.ID_MOIS <= 5 and ca_gecaprod.ANNEE = 2004 
    group by ddv.ID_DDV, ca_gecaprod.DOM_VENTE
     
    select ddv.NOM_DDV, ca_gecaprod.DOM_VENTE, sum(ca_gecaprod.CA_MOIS) as CA_CUM_N
    from ca_gecaprod,client,vendeur,rdv,ddv
    where ca_gecaprod.ID_CLT = client.ID_CLT and client.VL = vendeur.NOM_VENDEUR and vendeur.ID_RDV = rdv.ID_RDV and rdv.ID_DDV = ddv.ID_DDV and ca_gecaprod.ID_MOIS <= 5 and ca_gecaprod.ANNEE = 2005
    group by ddv.ID_DDV, ca_gecaprod.DOM_VENTE
     
    select ddv.NOM_DDV, ca_gecaprod.DOM_VENTE, sum(ca_gecaprod.CA_MOIS) as CA_CUM_N
    from ca_gecaprod,client,vendeur,rdv,ddv
    where ca_gecaprod.ID_CLT = client.ID_CLT and client.VL = vendeur.NOM_VENDEUR and vendeur.ID_RDV = rdv.ID_RDV and rdv.ID_DDV = ddv.ID_DDV and ca_gecaprod.ANNEE = 2004
    group by ddv.ID_DDV, ca_gecaprod.DOM_VENTE
    Merçi d'avance

  2. #2
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Bonjour,

    Il suffirait peut-être de regrouper les clauses WHERE avec des OR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select ddv.NOM_DDV, ca_gecaprod.DOM_VENTE, sum(ca_gecaprod.CA_MOIS) as CA_CUM_N1
    from ca_gecaprod,client,vendeur,rdv,ddv
    where 
     
    ( ca_gecaprod.ID_CLT = client.ID_CLT and client.VL = vendeur.NOM_VENDEUR and vendeur.ID_RDV = rdv.ID_RDV and rdv.ID_DDV = ddv.ID_DDV and ca_gecaprod.ID_MOIS <= 5 and ca_gecaprod.ANNEE = 2004) OR
     
    ( ca_gecaprod.ID_CLT = client.ID_CLT and client.VL = vendeur.NOM_VENDEUR and vendeur.ID_RDV = rdv.ID_RDV and rdv.ID_DDV = ddv.ID_DDV and ca_gecaprod.ID_MOIS <= 5 and ca_gecaprod.ANNEE = 2005) OR
     
    ( ca_gecaprod.ID_CLT = client.ID_CLT and client.VL = vendeur.NOM_VENDEUR and vendeur.ID_RDV = rdv.ID_RDV and rdv.ID_DDV = ddv.ID_DDV and ca_gecaprod.ANNEE = 2004)
     
    group by ddv.ID_DDV, ca_gecaprod.DOM_VENTE
    Bien sur, cette requete est simplifiable.

  3. #3
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Je ne suis pas tout à fait d'accord avec Adjanakis car dans le SELECT, sum(ca_gecaprod.CA_MOIS) porte le nom CA_CUM_N1 ou CA_CUM_N suivant la requête.

    De fait, je ne pense pas qu'une UNION soit possible entre ces requêtes (vu que les colonnes sont différentes), à moins d'une bidouille qui ne me plait pas trop (rajouter NULL AS CA_CUM_N1 et NULL AS CA_CUM_N dans le SELECT).

    Si tu dois absolument donner des noms différents à tes colonnes (pour des raison de traitement, par exemple), il vaut mieux ajouter des IF dans ton select:

    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
    SELECT
      ddv.NOM_DDV, ca_gecaprod.DOM_VENTE,
     
      IF (
        <condition_n1>
      , 
        sum(ca_gecaprod.CA_MOIS)
      ,
        NULL
      ) AS CA_CUM_N1,
     
      IF (
        <condition_n_2004>
        OR <condition_n_2005>
      , 
        sum(ca_gecaprod.CA_MOIS)
      ,
        NULL
      ) AS CA_CUM_N,
     
    from ca_gecaprod, client, vendeur, rdv, ddv
     
    WHERE
      # Conditions liées à la jointure
      ( ca_gecaprod.ID_CLT = client.ID_CLT 
      AND client.VL = vendeur.NOM_VENDEUR
      AND vendeur.ID_RDV = rdv.ID_RDV
      AND rdv.ID_DDV = ddv.ID_DDV)
     
      AND
      # Conditions liées à la sélection
      ( <condition_n1>
      OR <condition_n_2004>
      OR <condition_n_2005>)
    En remplaçant bien sûr <condition_n1>, <condition_n_2004> et <condition_n_2005> par ce qu'il faut !

  4. #4
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    En effet, mea culpa, j'avais mal lu !

    Pour me faire pardonner, une version simplifiée et plus correcte :
    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
     
     
    SELECT ddv.NOM_DDV, ca_gecaprod.DOM_VENTE, 
           (sum(ca_gecaprod.CA_MOIS)*ELT((ca_gecaprod.ID_MOIS <= 5 and ca_gecaprod.ANNEE = 2004)+1,NULL,1)) AS CA_CUM_N1,
           (sum(ca_gecaprod.CA_MOIS)*ELT((ca_gecaprod.ID_MOIS <= 5 and ca_gecaprod.ANNEE = 2004)+1,1,NULL)) AS CA_CUM
     
    FROM ca_gecaprod 
         INNER JOIN client USING ID_CLT
         INNER JOIN vendeur ON (client.VL = vendeur.NOM_VENDEUR)
         INNER JOIN rdv USING ID_RDV
         INNER JOIN ddv USING ID_DDV
     
    WHERE (ca_gecaprod.ID_MOIS <= 5 and ca_gecaprod.ANNEE = 2004)
          OR (ca_gecaprod.ID_MOIS <= 5 and ca_gecaprod.ANNEE = 2005)
          OR (ca_gecaprod.ANNEE = 2004)
     
    GROUP BY ddv.ID_DDV, ca_gecaprod.DOM_VENTE

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Je touve que le SELECT est moins lisible. Je préfère les IF, au moins on sait ce qui est affiché en fonction de la condition du IF, plutôt que par une formule de math qu'il faut déchiffrer (c'est plus simple pour trouver d'éventuels bugs)

    Au niveau des jointures, on peut effectivement les faire dans le FROM (c'est aussi plus lisible)

    La condition dans le WHERE peut être simplifiée. On passerait de ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE (ca_gecaprod.ID_MOIS <= 5 and ca_gecaprod.ANNEE = 2004)
          OR (ca_gecaprod.ID_MOIS <= 5 and ca_gecaprod.ANNEE = 2005)
          OR (ca_gecaprod.ANNEE = 2004)
    à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE 
     (ca_gecaprod.ANNEE = 2004) OR
     (ca_gecaprod.ID_MOIS <= 5  AND ca_gecaprod.ANNEE = 2005)

    J'avais effectivement oublié le GROUP BY...

Discussions similaires

  1. [AC-2007] Fusionner des informations dans une requête
    Par Vince26exe dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/11/2011, 08h57
  2. Requête SQL pour fusionner des colonnes
    Par Aenur56 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 20/05/2010, 19h23
  3. fusionner des requêtes
    Par bourguignon21 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 11/07/2007, 10h54
  4. [SQL server] Comment Fusionner des données dans une requête
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 15h24
  5. [] [Excel] Fusionner des cellules
    Par SamyD dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/12/2002, 18h37

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