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 :

Mixer 2 requêtes SQL en 1 seule


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Ingénieur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 53
    Points
    53
    Par défaut Mixer 2 requêtes SQL en 1 seule
    Bonjour à tous,
    J'aimerai pouvoir mixer 2 requêtes SQL sur un seul tableau, mais je bloque. Je ne suis peut être pas parti dans la bonne direction..

    J'ai une première requête complexe, qui me permet d'avoir les résultats dont j'ai besoin :

    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
     
    WITH
    tnbJO AS (
    		SELECT count(*) nbJO FROM `t_calendrier` WHERE DATE(DTJOUR_DT) BETWEEN CURDATE() - INTERVAL 1 MONTH AND CURDATE() and TypeJour='O'
    	),
    tetp AS (
    		SELECT t.ENTITEADR,t.dom, sum( t.uoadr ) sum_tache, e.etp nb_etp, ((sum(t.uoadr))/(e.etp)) tx_charge2
    		FROM t_data_adr_conf t 
    		INNER JOIN t_ref_etp e ON e.libentite = t.ENTITEADR
    		WHERE (DATE(DTFINREL_DT) BETWEEN CURDATE() - INTERVAL 1 MONTH AND CURDATE()) and t.dom in (
    SELECT DISTINCT dom
    FROM `t_data_adr_conf`
    WHERE dom in ('THD-PRODUIT','2M','REA','MAJ AQD')
    )
    		GROUP BY t.ENTITEADR,t.dom
    		ORDER BY t.ENTITEADR,t.dom
    	),
    refetp AS (SELECT val from t_config where descr='ref_etp_min'),
    reftaux AS (SELECT val from t_config where descr='taux_etp') 
    SELECT tetp.dom,tETP.ENTITEADR,tETP.nb_etp, tETP.sum_tache/((tETP.nb_etp*(tnbJO.nbJO*refetp.val))*reftaux.val) tx_charge
    FROM tnbJO,tETP,refetp,reftaux
    Group by tETP.ENTITEADR,tetp.dom
    Mais le problème c'est que je n'ai les résultat que pour les entrées où tetp.dom et tETP.ENTITEADR ont des valeurs.

    J'aimerai pouvoir récupérer la dernière colonne de cette première requête en 3e colonne de cette 2e requête (avec un produit cartésien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tentite.entiteadr,tdoma.dom
    from
    	(SELECT distinct entiteadr FROM `t_data_adr_conf`) tentite,
    	(SELECT distinct dom FROM `t_data_adr_conf`) tdoma
    tout ça au final pour avoir la totalité des valeurs (calculées) des 2 premières colonnes et y ajouter (résultat) les valeurs de la première requête.

    Et je bloque..
    Merci pour votre aide.

    Steven

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    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 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Peux-tu nous donner un exemple de ce que tu veux obtenir (des lignes renvoyées par les deux requêtes, et le résultat attendu) ?
    Accessoirement je ne vois pas trop l'utilité de sous-requêtes dans le deuxième cas, un CROSS JOIN entre les deux tables fera la même chose:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT distinct tentite.entiteadr,tdoma.dom
    from t_data_adr_conf as tentite
    cross join t_data_adr_conf as tdoma
    Mais comme je fais rarement des produit cartésiens, j'avoue que je ne sais pas quelle requête est la plus efficace.

    Tatayo.

  3. #3
    Membre du Club
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti Ingénieur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 53
    Points
    53
    Par défaut
    Pour la première requete :

    dom | entite | nb | taux
    2M | ILE DE FRANCE | 13 | 0.17089160839160839
    MAJ AQD | ILE DE FRANCE | 13 | 0.035742035742035744
    THD-PRODUIT | ILE DE FRANCE | 13 | 1.282488344988345
    2M | NORD | 17.5 | 0.20075757575757575
    MAJ AQD | NORD | 17.5 | 0.01893939393939394
    REA | NORD | 17.5 | 0.008658008658008658

    Et pour la 2e requete qui liste les regroupements dont j'ai besoin :

    entite | dom
    SUD EST | 2M
    SUD OUEST | 2M
    NORD | 2M
    ILE DE FRANCE | 2M
    OUEST | 2M
    SUD EST | THD
    SUD OUEST | THD
    NORD | THD
    ILE DE FRANCE | THD
    OUEST | THD
    SUD EST | INFRA
    SUD OUEST | INFRA
    NORD | INFRA
    ILE DE FRANCE | INFRA
    OUEST | INFRA
    SUD EST | REA
    SUD OUEST | REA
    etc...

    et je voudrais mettre les "nb" et "taux" de la première requête dans une 3e colonne de la 2e requête, et si pas de correspondance : "null".

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 055
    Points
    19 055
    Par défaut
    Salut stevenP.

    Il suffit de fusionner les deux requêtes en une seule.
    Le résultat de la première requête se nomme "autre".
    La seconde requête se nomme "ajout".
    La troisième colonne de la requête "ajout" sera la même colonne que la dernière colonne de la requête "autre".
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    WITH tnbJO   AS (      SELECT  count(*) as nbJO
                             FROM  `t_calendrier`
                            WHERE  DATE(DTJOUR_DT) BETWEEN CURDATE() - INTERVAL 1 MONTH AND CURDATE()
                              AND  TypeJour='O'
                    ),
     
         tetp    AS (      SELECT  t.ENTITEADR,
                                   t.dom,
                                   sum(t.uoadr)           as sum_tache,
                                   e.etp                  as nb_etp,
                                   (sum(t.uoadr))/(e.etp) as tx_charge2
                             FROM  t_data_adr_conf        as t
                       INNER JOIN  t_ref_etp              as e
                               ON  e.libentite = t.ENTITEADR
                            WHERE  DATE(DTFINREL_DT) BETWEEN CURDATE() - INTERVAL 1 MONTH AND CURDATE()
                              AND  t.dom in (   SELECT  DISTINCT dom
                                                  FROM  `t_data_adr_conf`
                                                 WHERE  dom in ('THD-PRODUIT','2M','REA','MAJ AQD')
                                            )
                         GROUP BY  t.ENTITEADR, t.dom
                         ORDER BY  t.ENTITEADR, t.dom
                    ),
     
         refetp  AS (      SELECT  val
                             FROM  t_config
                            WHERE  descr = 'ref_etp_min'
                    ),
     
         reftaux AS (      SELECT  val
                             FROM  t_config
                            WHERE  descr = 'taux_etp'
                    ),
     
         autre   AS (      SELECT  tetp.dom,
                                   tetp.ENTITEADR,
                                   tetp.nb_etp,
                                   tetp.sum_tache / ((tetp.nb_etp * (tnbJO.nbJO * refetp.val)) * reftaux.val) as tx_charge
                             FROM  tnbJO,
                                   tetp,
                                   refetp,
                                   reftaux
                         GROUP BY  tetp.ENTITEADR,
                                   tetp.dom
                    )
     
         ajout   AS (      SELECT  tentite.entiteadr,
                                   tdoma.dom,
                                   autre.tx_charge
                             from  (  SELECT  distinct entiteadr
                                        FROM  `t_data_adr_conf`
                                   ) AS tentite,
                                   (  SELECT  distinct dom
                                        FROM `t_data_adr_conf`
                                   ) AS tdoma,
                                   autre
    ;
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par stevenP Voir le message
    et je voudrais mettre les "nb" et "taux" de la première requête dans une 3e colonne de la 2e requête, et si pas de correspondance : "null".
    Il faut faire une jointure externe entre la requête 1 et la requête 2 sur dom, ENTITEADR, quelque chose ça :
    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
    46
    47
    48
      WITH tnbJO AS (
    SELECT count(*) nbJO 
      FROM t_calendrier 
     WHERE DATE(DTJOUR_DT) BETWEEN CURDATE() - INTERVAL 1 MONTH AND CURDATE() and TypeJour='O'
    ),
           tetp AS (
    SELECT t.ENTITEADR
         , t.dom
         , sum( t.uoadr ) sum_tache
         , count(e.etp) nb_etp -- j'imagine que c'est un count qui manquait
      --   , ((sum(t.uoadr))/(e.etp)) tx_charge2 -- pas utilisé après
      FROM t_data_adr_conf t 
     INNER JOIN t_ref_etp e ON e.libentite = t.ENTITEADR
     WHERE (DATE(DTFINREL_DT) BETWEEN CURDATE() - INTERVAL 1 MONTH AND CURDATE()) 
       and t.dom in ('THD-PRODUIT','2M','REA','MAJ AQD') -- Je vois pas l'intérêt de la sous-requête IN, je l'ai supprimée
     GROUP BY t.ENTITEADR,t.dom
     ORDER BY t.ENTITEADR,t.dom
    ),
           refetp AS (
    SELECT val from t_config where descr='ref_etp_min'
    ),
           reftaux AS (
    SELECT val from t_config where descr='taux_etp'
    ),
           calc as ( 
    SELECT tetp.dom
         , tETP.ENTITEADR
         , tETP.nb_etp
         , tETP.sum_tache/((tETP.nb_etp*(tnbJO.nbJO*refetp.val))*reftaux.val) tx_charge
      FROM tnbJO
     cross join tETP
     cross join refetp
     cross join reftaux
     Group by tETP.ENTITEADR,tetp.dom
    ),
           src as (
    SELECT tentite.entiteadr
         , tdoma.dom
      from      (SELECT distinct entiteadr FROM t_data_adr_conf) tentite
     cross join (SELECT distinct dom FROM t_data_adr_conf) tdoma
    )
    select s.entiteadr
         , s.dom
         , c.nb_etp
         , c.tx_charge
      from src s
      left join calc c on c.ENTITEADR = s.entiteadr
                      and c.dom       = s.dom

Discussions similaires

  1. [MySQL] Réunir 3 requêtes SQL en une seule
    Par Furil dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/06/2013, 11h08
  2. regrouper deux requêtes sql en un seul
    Par eddjalal dans le forum Développement
    Réponses: 0
    Dernier message: 14/01/2011, 15h47
  3. Requête SQL DELETE mais d'un seul enregistrement
    Par stefg13 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 15/12/2009, 17h53
  4. Requête SQL: Afficher Gratuit/Payant en une seule fois
    Par Sethenssen dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/11/2009, 20h43
  5. [SQL] En une seule requête
    Par Spaccio dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/06/2006, 20h38

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