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.




A voir également:

6 réponses

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
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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