Pb de résultat dans une requete qui utilise des sous-select

bouffon de service -  
 bouffon de service -
Bonjour à tous,

Je travaille sous Oracle 10

Je souhaite extraire pour chaque secteurs la somme des Tps des préventifs 'Fait' et 'à faire' dans une palge de dates
Lorsque je lance la requête ci-dessous:

select substr(C.cd_box2,1, 10) Secteurs, Tps_prévu_a_faire, Tps_fait
from
    ( select cd_box2, sum(tm_Fcast_tech_modi) Tps_prévu_a_faire
      from WS
      where cd_action_type ='PREV'
      and cd_wows_status ='3'
      and dt_ws_begin >= to_date('01032013','DDMMYYYY')
      and dt_ws_begin <= to_date('31032013','DDMMYYYY')
      group by cd_box2
    )A,
    ( select cd_box2, sum(tm_Fcast_tech_modi) Tps_fait
      from WS
      where cd_action_type ='PREV'
      and cd_wows_status ='6'
      and dt_ws_begin >= to_date('01032013','DDMMYYYY')
      and dt_ws_begin <= to_date('31032013','DDMMYYYY')
      group by cd_box2
    )B,
     WS C
where A.cd_ws = C.cd_ws
and B.cd_ws = C.cd_ws
and C.cd_box2 not like '%null%'
order by 1


il m'affiche un message d'erreur suivant:

ORA-00904: "B"."CD_WS": invalid identifier


j'enlève dans la jointure ( and B.cd_ws = C.cd_ws )le "B." et que je relance celle-ci,
il m'affiche un autre message d'erreur mais pour la ligne de dessus.

ORA-00904: "A"."CD_WS": invalid identifier


j'enlève dans la jointure ( and A.cd_ws = C.cd_ws )le "A." et que je relance la requete,
celle-ci s'exécute et affiche un résultat au bout de 1:20 minutes avec 1 950 614 lignes.

Je ne devrais avoir q'une dizaine de lignes en tout.

Question: La structure de la requete de base est elle correcte ?
Ou est-je commis le ou les erreurs d'écriture ?

Merci pour votre aide. Slts.

6 réponses

  1. Utilisateur anonyme
     
    Bonjour

    Je ne comprends pas dans ta requête ce que signifie A.cd_ws : La sous requête A renvoie A.cd_box2 et A.Tps_prévu_a_faire, mais aucun A.cd_ws. Idem pour B.cd_ws.
    Tu n'aurais pas oublié d' ajouter le champ cd_ws dans tes sous-requêtes ?

    select substr(C.cd_box2,1, 10) Secteurs, Tps_prévu_a_faire, Tps_fait 
    from 
        ( select cd_ws,cd_box2, sum(tm_Fcast_tech_modi) Tps_prévu_a_faire 
          from WS 
          where cd_action_type ='PREV' 
          and cd_wows_status ='3' 
          and dt_ws_begin >= to_date('01032013','DDMMYYYY') 
          and dt_ws_begin <= to_date('31032013','DDMMYYYY') 
          group by cd_box2 
        )A, 
        ( select cd_ws, cd_box2, sum(tm_Fcast_tech_modi) Tps_fait 
          from WS 
          where cd_action_type ='PREV' 
          and cd_wows_status ='6' 
          and dt_ws_begin >= to_date('01032013','DDMMYYYY') 
          and dt_ws_begin <= to_date('31032013','DDMMYYYY') 
          group by cd_box2 
        )B, 
         WS C 
    where A.cd_ws = C.cd_ws 
    and B.cd_ws = C.cd_ws 
    and C.cd_box2 not like '%null%' 
    order by 1
    0
  2. bouffon de service
     
    Bonjour, Le père

    De mon point de vue , non. Il n'est pas nécessaire de rajouter le CD_WS.
    Les données que je veux extraire sont dans une seule table.
    Il est possible que l'écriture des jointures dans le WHERE ne soient pas correct.
    Il est fort possible que j'ai comis une erreur d'écriture à ce niveau là, mais je
    ne voit pas ou ???

    Quand je lance une des 2 sous-requêtes seule , j'ai les bonnes données qui apparaissent.
    select  cd_box2, sum(tm_Fcast_tech_modi) Tps_fait 
          from WS 
          where cd_action_type ='PREV' 
          and cd_wows_status ='6' 
          and dt_ws_begin >= to_date('01032013','DDMMYYYY') 
          and dt_ws_begin <= to_date('31032013','DDMMYYYY') 
          group by cd_box2
          order by 1
    


    
    CD_BOX2                TPS_FAIT
    --------------------       ----------
    BOBINAGE...              483333
    CAGE._50                1658333
    COMMUN..AU..J          200000
    FIN...50                     741665
    J..2                            150000
    J..4                            625000
    LF._J4                       533332
    LF._LS-40                 166666
    LF._LT-60                 499998
    LS40                       1058331
    LT60                       2116666
    
    
    0
  3. Utilisateur anonyme
     
    De mon point de vue , non
    As-tu essayé ?
    Maintenant que j'ai essayé ce qui me semblait évident, je peux te le confirmer : il y a bien un problème à ce niveau-là. Je ne dis pas que c'est le seul.

    Les données que je veux extraire sont dans une seule table
    OSEF. Quand tu écris B.cd_ws, tu dis explicitement : "le champ cd_ws de la sous-requête B". Or la sous-requête B N'A PAS de champ cd_ws. Et c'est bien là-dessus que porte ton message d'erreur.
    0
  4. bouffon de service
     
    Re-Bjr, le père

    Oui , j'ai essayé. Cela ne m'apporte rien de plus.
    Si je suis ton résonnement , je lance les sous-requêtes en rajoutant de CD_WS dans le select
    select cd_box2, cd_ws, sum(tm_Fcast_tech_modi) Tps_prévu_a_faire 
          from WS 
          where cd_action_type ='PREV' 
          and cd_wows_status ='6' 
          and dt_ws_begin >= to_date('01032013','DDMMYYYY') 
          and dt_ws_begin <= to_date('31032013','DDMMYYYY') 
          group by cd_box2, cd_ws
          order by 1
    


    voilà ce que cela donne comme résultat:

    CD_BOX2                   CD_WS TPS_PRÉVU_A_FAIRE
    -------------------- ---------- -----------------
    BOBINAGE...                   1            483333
    CAGE._50                      1           1658333
    COMMUN..AU..J                 1            200000
    FIN...50                      1            741665
    J..2                          1            150000
    J..4                          1            625000
    LF._J4                        1            533332
    LF._LS-40                     1            166666
    LF._LT-60                     1            499998
    LS40                          1           1058331
    LT60                          1           2116666
    
    CD_BOX2                   CD_WS TPS_PRÉVU_A_FAIRE
    -------------------- ---------- -----------------
    MDA.                          1            475000
    MOBB_                         1            358332
    QT40.                         1            183333
    S/E._50                       1           1308333
    SOMFY_                        1             75000
    ST50_                         1            600000
    SUP_CTRL.                     1             50000
    


    idem pour l'autre requête :

    select cd_box2, cd_ws, sum(tm_Fcast_tech_modi) Tps_prévu_a_faire 
          from WS 
          where cd_action_type ='PREV' 
          and cd_wows_status ='3' 
          and dt_ws_begin >= to_date('01032013','DDMMYYYY') 
          and dt_ws_begin <= to_date('31032013','DDMMYYYY') 
          group by cd_box2, cd_ws
          order by 1
    


    CD_BOX2                   CD_WS TPS_PRÉVU_A_FAIRE
    -------------------- ---------- -----------------
    BOBINAGE...                   1           2475000
    CAGE._50                      1            616666
    LF._MOBB/MDA                  1            150000
    MDA.                          1            175000
    


    Cela ne m'apporte rien de plus, juste une colonne en plus.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    Tu n'as pas suivi mon raisonnement.

    Quand tu lances une sous-requête individuellement, ce n'est plus une sous-requête, ça devient une requête. Ça n'a plus aucun rapport et d'ailleurs tu n'as pas de message d'erreur.

    Je te parle d'essayer la requête complète, celle que tu donnais dans ta question initiale.

    Tu demandais si tu avais commis une erreur d'écriture et si oui, où. Je t'ai répondu et je t'ai montré où.
    Je ne parle que du message d'erreur que tu avais, la logique de la requête est un autre problème.

    As-tu toujours le même message d' erreur
    ORA-00904: "B"."CD_WS": invalid identifier

    avec la requête que je t'avais donnée là ?
    0
  7. bouffon de service
     
    Re-Bjr, le père

    J'ai lancé la rqte complète (celle ou tu mis le CD_WS ). il ma affiché le message d'erreur suivant :
    ORA-00979: not a GROUP BY expression
    

    Je pense que c'est normal.
    J'ai rajouté dans les GROUP BY des 2 sous-select le champ CD_WS.
    J'ai relancé la requête à 12h24 .
    Maintenant, il est 12h50 et elle pédale toujours. elle n'affiche aucun message d'erreur.
    0