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

SQL Oracle Discussion :

Fusionner 2 requêtes en 1 [10g]


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2006
    Messages : 33
    Points : 22
    Points
    22
    Par défaut Fusionner 2 requêtes en 1
    Bonsoir,

    Je souhaite fusionner 2 requêtes, afin d'avoir le résultat en 1 fois. N'étant pas très doué en sql, est ce qu'une âme charitable pourrait me donner un petit coup de pouce.

    Je vous en remercie.

    Cordialement
    Laurent

    Requête 1:

    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
    select
      B.cd_cost_center, substr(A.cd_box,1, 5) eqpts, substr(sum(C.pr_hour_cost * C.tm_occupation)/100000,1, 6) tot_PREV
        from
        WO A
        INNER JOIN WS B
        on A.cd_wo = B.cd_wo
       INNER JOIN OCCUPATION C
       on C.cd_wo = A.cd_wo
       and C.cd_ws = B.cd_ws
       where
             (
              B.cd_action_type = 'PREV_N_PRO'
              or
              B.cd_action_type = 'INTERV_PRO'
              or
              B.cd_action_type = 'PREV'
             )
       and B.dt_ws_begin >= to_date('01022015 00:00:01','DDMMYYYY HH24:MI:SS')
       and B.dt_ws_begin <= to_date('28022015 23:59:59','DDMMYYYY HH24:MI:SS')
    group by B.cd_cost_center, substr(A.cd_box,1, 5)
    order by 1, 2
    Résultat 1 obtenu:
    CD_COST_CENTER EQPTS TOT_PR
    -------------------- ----- ------
    valeur A valeur B Valeur C



    Requête 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select
      B.cd_cost_center, substr(A.cd_box,1, 4) eqpts, substr(sum(C.pr_hour_cost * C.tm_occupation)/100000,1, 6) tot_Cur
        from
        WO A
        INNER JOIN WS B
        on A.cd_wo = B.cd_wo
       INNER JOIN OCCUPATION C
       on C.cd_wo = A.cd_wo
       and C.cd_ws = B.cd_ws
       where B.cd_action_type = 'CUR'
       and B.dt_ws_begin >= to_date('01022015 00:00:01','DDMMYYYY HH24:MI:SS')
       and B.dt_ws_begin <= to_date('28022015 23:59:59','DDMMYYYY HH24:MI:SS')
    group by B.cd_cost_center, substr(A.cd_box,1, 4)
    order by 1, 2
    Résultat 2 obtenu:
    CD_COST_CENTER EQPTS TOT_CU
    -------------------- ----- ------
    valeur A valeur B Valeur D


    Résultat souhaité:
    CD_COST_CENTER EQPTS TOT_PR TOT_CU
    -------------------- ----- ------ ------
    valeur A valeur B Valeur C Valeur D

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    De manière très bourrin, ca donne ca (mais c'est optimisable)

    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
    select	 coalesce(A.cd_cost_center, B.cd_cost_center) as cd_cost_center
    		,coalesce(A.eqpts, B.eqpts) as eqpts
    		,tot_PREV
    		,tot_Cur
    FROM 
    (select
      B.cd_cost_center, substr(A.cd_box,1, 5) eqpts, substr(sum(C.pr_hour_cost * C.tm_occupation)/100000,1, 6) tot_PREV
        from
        WO A
        INNER JOIN WS B
        on A.cd_wo = B.cd_wo
       INNER JOIN OCCUPATION C
       on C.cd_wo = A.cd_wo
       and C.cd_ws = B.cd_ws
       where
             (
              B.cd_action_type = 'PREV_N_PRO'
              or
              B.cd_action_type = 'INTERV_PRO'
              or
              B.cd_action_type = 'PREV'
             )
       and B.dt_ws_begin >= to_date('01022015 00:00:01','DDMMYYYY HH24:MI:SS')
       and B.dt_ws_begin <= to_date('28022015 23:59:59','DDMMYYYY HH24:MI:SS')
    group by B.cd_cost_center, substr(A.cd_box,1, 5)
    ) A 
    FULL OUTER JOIN 
    (
    select
      B.cd_cost_center, substr(A.cd_box,1, 4) eqpts, substr(sum(C.pr_hour_cost * C.tm_occupation)/100000,1, 6) tot_Cur
        from
        WO A
        INNER JOIN WS B
        on A.cd_wo = B.cd_wo
       INNER JOIN OCCUPATION C
       on C.cd_wo = A.cd_wo
       and C.cd_ws = B.cd_ws
       where B.cd_action_type = 'CUR'
       and B.dt_ws_begin >= to_date('01022015 00:00:01','DDMMYYYY HH24:MI:SS')
       and B.dt_ws_begin <= to_date('28022015 23:59:59','DDMMYYYY HH24:MI:SS')
    group by B.cd_cost_center, substr(A.cd_box,1, 4)
    ) B ON A.cd_cost_center = B.cd_cost_center and A.eqpts = B.eqpts
    order by 1,2

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Oui il y a mieux que le FULL JOIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with cte_union (A, B, C, D) as
    (
    select A, B, C, null
      from table
     union all
    select A, B, null, D
      from table
    )
      select A, B, max(C) as C, max(D) as D
        from cte_union 
    group by A, B;
    Mais dans ce cas de figure présent, on peut réécrire la requête complètement :
    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 B.cd_cost_center
           , substr(A.cd_box, 1, 5) as eqpts
           , substr(sum(case when B.cd_action_type in ('PREV', 'PREV_N_PRO', 'INTERV_PRO') then C.pr_hour_cost * C.tm_occupation else 0 end) / 100000, 1, 6) as tot_PREV
           , substr(sum(case when B.cd_action_type = 'CUR'                                 then C.pr_hour_cost * C.tm_occupation else 0 end) / 100000, 1, 6) as tot_Cur
        from WO         A
        join WS         B  on B.cd_wo = A.cd_wo
        join OCCUPATION C  on C.cd_wo = A.cd_wo
                          and C.cd_ws = B.cd_ws
       where B.dt_ws_begin >= to_date('01022015 00:00:01','DDMMYYYY HH24:MI:SS')
         and B.dt_ws_begin <= to_date('28022015 23:59:59','DDMMYYYY HH24:MI:SS')
         and B.cd_action_type in ('CUR', 'PREV', 'PREV_N_PRO', 'INTERV_PRO')
    group by B.cd_cost_center
           , substr(A.cd_box, 1, 5)
    order by B.cd_cost_center       asc
           , substr(A.cd_box, 1, 5) asc;

  4. #4
    Membre à l'essai
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2006
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2006
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Bonjour,

    Excellent, exactement ce que je souhaitais.
    Merci pour vos réponses.



    Cordialement

    Laurent

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fusionner des requêtes
    Par bourguignon21 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 11/07/2007, 10h54
  2. [Oracle 9i] Fusionner 2 requêtes
    Par supermarsu dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/05/2007, 08h52
  3. [MySQL] Fusionner deux requêtes
    Par jpascal dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/12/2006, 01h51
  4. Fusionner des requêtes
    Par SwiTz dans le forum Requêtes
    Réponses: 4
    Dernier message: 08/11/2005, 22h00
  5. Fusionner 3 requêtes avec un SUM en une seule
    Par David Guillouet dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/07/2004, 15h54

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