sql: Je suis desespere !!!! Le suicide est proche :(

sql: Je suis desespere !!!! Le suicide est proche :( - Programmation

Marsh Posté le 12-04-2001 à 19:14:16    

Voila... ca fait une semaine et ke dalle... j'y arrive pas c tout. Alors je solicite votre aide a tous... merci de m'aider :jap::jap:
 
Le pb. en tres tres gros : Extraire des donnees de trois tables. Ca semble simple, hien ? Mais j'y arrive pas. Je suis sous ORACLE 8
 
Hypotheses:
  3 tables: personne, operation, et operation_type,
  dont les champs sont :
 
  - personn :  
     nom, prenom, id_fixe, user_id et pers_id (PK)
  - operation :
     date_fixe, op_pers_id(FK sur personne), op_id(PK),
     op_type_id (FK sur operation_type), date_modif
  - operation_type :
     op_type_id (PK), description
 
Ce que je veux faire : :??:
  - extraire : le nom, le prenom, l'id fixe, le pers_id, le type d'operation (description), la date fixe et la date de derniere modification.
 
Conditions :
C la ke ca se corse... Car elles sont impossible a satisfaire.. enfin, d'aprs moi... :(
  - Je veux le nom et prenom ainsi ke le pers_id et l'id_fixe des personnes dont le user_id vaut n.
  - Je veux aussi l'operation la plus recemment modifiee (date_modif) avec sa description et sa date fixe, pour chacune de ces personnes.
  - De plus si l'operation est de type (description) 'xx' alors prendre aussi l'opération précédente (juste avant celle-ci, du point de vue de la date de modification).
  - Et pour couronner le tout, FAIRE CELA EN SQL EN UNE SEULE REQUETE (voire avec des sous-requetes imbriquées et/ou corélées).
  - C'est à dire pas de curseur, proc. stoc., ni de fonc. stoc.
  (enfin, si vous avez une soluce avec ces derniers, jsuis preneurs qd meme :D ).
 
Voila !!! c t long je sais mais siouplez aider moi !! :cry:

 

[edit]--Message édité par wouatouwouatou--[/edit]

Reply

Marsh Posté le 12-04-2001 à 19:14:16   

Reply

Marsh Posté le 12-04-2001 à 20:58:21    

désolé je ne peux pas te repondre. Moi quand j'avais des requetes chiantes a faire, je faisais plein de petites requetes et ensuite je m'amusais en javascript, mais c'etait pour un intranet alors c'etait justifié.

Reply

Marsh Posté le 12-04-2001 à 21:18:12    

Je compatis ...

Reply

Marsh Posté le 13-04-2001 à 10:15:24    

beuheuu... :(
 
:( :gun:

Reply

Marsh Posté le 13-04-2001 à 10:21:58    

ouagf ouaf le jeu de mot avec ta CP id_fixe.... c en rapport avec asterix ou pas?
non plus serieusement je me penche sur le pb là, j'ai meme sorti papier crayon et tout.... je m'etonne a vouloir faire de l'SQL , moi qui ai horreur de ça.
mais bon tu a l'air desemparé alors je vasi tenter !

Reply

Marsh Posté le 13-04-2001 à 10:35:46    

bon bon bon
j'avance , j'y suis presque d'ailleurs. (enfin je crois)
voila le debut :  
select nom, prenom, id_fixe, pers_id, description, date_fixe,
       date_modif
       from  personne,operation, op_type
       where pers_id = op_pers_id
        and  operation.op_type_id = op_type.op_type_id
        and user_id like '%n%' (là je c pas trop, c peut etre que 'n' dans ton cas')
        and date_modif = (select ....
 
 
voila j'en suis là. il me semble que ce qu'il faudrait faire c'est :
a l'aide des ensembles (union et tout ça) , tu vires toutes les operations du type xx, puis ensuite, dans l'ensemble obtenu, tu prend celle dont la date de modif est max.
alors ?

Reply

Marsh Posté le 13-04-2001 à 10:54:49    

OUPS... Je viens de m'apercevoir ke j'ai mal formuler un point tres tres important ..et c d'ailleur ca ki m'emmer.. le plus
Désolé... revoyez le message.. je vai essayer de le reédité...
C a propos du : Si l'operation est du type 'xx'...
Ben, faut prendre en fait les deux !!!! c a dire la derniere operation ainsi ke la précédente...
 
Désolé encore une fois... :jap:
 
Merci [g]infiniment{/g] d'y réfléchir :jap::jap:

Reply

Marsh Posté le 13-04-2001 à 13:23:03    

Bah je te le fais ce week end
La je suis trop occupé :(
Mais bientôt le week end :) de trois jours :)

Reply

Marsh Posté le 13-04-2001 à 14:10:11    

Les 2 opérations (qd il y en a 2), il te les faut sur la même ligne ou sur 2 lignes successives ?

Reply

Marsh Posté le 13-04-2001 à 15:50:44    

Pour l'histoire de la derniere operation et de l'avant derniere, je me ferais pas chier...
Fait ton SELECT avec un tri par date... comme ca la derniere operation c'est la premiere ligne et l'avant derniere c'est la deuxieme ligne que tu ne lis que si la premiere est de type xx...
 
Je ne sais pas si c'est possible mais sinon bon courage...

Reply

Marsh Posté le 13-04-2001 à 15:50:44   

Reply

Marsh Posté le 13-04-2001 à 17:37:24    

Mile V > il me faut les deux sur la même ligne.
 
Mais ca y est.. je crois ke j'ai trouvé :D trop [G]heureux[/g] !!!
Vous pouvez pas savoir... Ca faisait pres d'une semaine ke jetais dessus..
Vous voulez la voir ?
Mais elle est tres tres longue... Car je vous fais un copie/coller et donc elle est complète (j'ai rien retiré)
Maintenant, faudrait ke kkun me dise si elle fait bien ce que je veux... une sore de correction koi :D
Voici ma requete si ca interesse tjrs kkun :)
 

                   SELECT  
                     p.pers_id,  
                     DECODE(p.priority_id,'0','0','1') priorite,  
                     p.rela_id,  
                     DECODE(concat(concat(DECODE(rtrim(p.pers_lname),null,'',rtrim(p.pers_lname)),' '),DECODE(rtrim(p.pers_fname),null,'',rtrim(p.pers_fname))),' ','---',concat(concat(DECODE(rtrim(p.pers_lname),null,'',rtrim(p.pers_lname)),' '),DECODE(rtrim(p.pers_fname),null,'',rtrim(p.pers_fname)))) full_name,  
                     DECODE(p.pers_private_phone,null,DECODE(p.pers_office_phone,null,DECODE(p.pers_mobil_phone,null,'0','1'),'1'),'1') telephone,  
                     DECODE(p.pers_email,null,'0','1') email,  
                     DECODE(p.pers_prospect,'2','1','0') internet,  
                     o_con.oper_id operation_de_contact,  
                     o_rel.oper_id operation_de_relance,  
                     o_rel.oper_realisation_date date_de_relance,  
                     ot_rel.oper_type_description motif_de_relance,  
                     DECODE(t1.date_contact,null,'NA',concat(concat(rtrim(ot_con.oper_type_description),'/'),rtrim(s_con.status_short_label))) precedente,  
                     o_con.operation_date derniere_date,  
                     o_rel.operation_date relance_date,  
                     max(o_rel.oper_realisation_date) max_date_de_relance,  
                     p.pers_prospect  
                   FROM  
                     person p,  
                     operation o_rel,  
                     operation_type ot_rel,  
                     operation_group og_rel,  
                     operation o_con,  
                     operation_type ot_con,  
                     operation_group og_con,  
                     status s_con,  
                     (
                       SELECT  
                         o1.oper_pers_id,  
                         max(o1.operation_date) date_relance,  
                         max(o2.operation_date) date_contact  
                       FROM  
                         operation o1,  
                         operation_type ot1,  
                         operation o2,  
                         operation_type ot2,  
                         operation_group og2,  
                         status s2  
                       WHERE  
                         --  opération de derniere relance  
                         --  critères de sélection de l'opération de relance  
                         o1.affected_user_id=82  
                         AND o1.oper_type_id=ot1.oper_type_id  
                         AND ot1.oper_group_id=og2.oper_group_id  
                         AND o1.oper_realisation_date is not null  
                         AND o1.oper_realisation_date <= sysdate  
                         --  opératon de dernier contact  
                         --  critères de sélection de l'opération de relance  
                         AND o2.oper_pers_id(+)=o1.oper_pers_id
                         AND o2.affected_user_id=o1.affected_user_id  
                         --  status de l'opération (différent de 'Lancé')  
                         AND o2.oper_last_status_id=s2.status_id  
                         AND lower(s2.status_short_label)<>'lancé'  
                         AND o2.oper_type_id=ot2.oper_type_id  
                         AND ot2.oper_group_id=og2.oper_group_id  
                         --  type d'opération : relance  
                         AND lower(og2.oper_group_description)='relance'  
                       GROUP BY  
                         o1.oper_pers_id  
                       HAVING  
                         max(o2.operation_date)<=max(o1.operation_date)  
                     ) t1  
                   WHERE  
                     p.pers_id=t1.oper_pers_id  
                     --  opération de relance  
                     --  critères de sélection de l'opération de relance  
                     AND o_rel.affected_user_id=p.pers_affected_user_id  
                     AND o_rel.oper_pers_id=t1.oper_pers_id  
                     AND o_rel.operation_date=t1.date_relance  
                     AND o_rel.oper_type_id=ot_rel.oper_type_id  
                     AND ot_rel.oper_group_id=og_rel.oper_group_id  
                     AND lower(og_rel.oper_group_description)='relance'  
                     --  opératon de contact  
                     --  critères de sélection de l'opération de relance  
                     AND o_con.oper_pers_id=o_rel.oper_pers_id
                     AND o_con.affected_user_id=o_rel.affected_user_id  
                     AND o_con.operation_date=t1.date_contact  
                     --  status de l'opération  
                     AND o_con.oper_last_status_id=s_con.status_id  
                     AND lower(s_con.status_short_label)<>'lancé'  
                     AND o_con.oper_type_id=ot_con.oper_type_id  
                     AND ot_con.oper_group_id=og_con.oper_group_id  
                     AND lower(og_con.oper_group_description)='relance'  
                   GROUP BY  
                     p.pers_id,  
                     DECODE(p.priority_id,'0','0','1'),  
                     p.rela_id,  
                     DECODE(concat(concat(DECODE(rtrim(p.pers_lname),null,'',rtrim(p.pers_lname)),' '),DECODE(rtrim(p.pers_fname),null,'',rtrim(p.pers_fname))),' ','---',concat(concat(DECODE(rtrim(p.pers_lname),null,'',rtrim(p.pers_lname)),' '),DECODE(rtrim(p.pers_fname),null,'',rtrim(p.pers_fname)))),  
                     DECODE(p.pers_private_phone,null,DECODE(p.pers_office_phone,null,DECODE(p.pers_mobil_phone,null,'0','1'),'1'),'1'),  
                     DECODE(p.pers_email,null,'0','1'),  
                     DECODE(p.pers_prospect,'2','1','0'),  
                     o_con.oper_id,  
                     o_rel.oper_id,  
                     o_rel.oper_realisation_date,  
                     ot_rel.oper_type_description,  
                     DECODE(t1.date_contact,null,'NA',concat(concat(rtrim(ot_con.oper_type_description),'/'),rtrim(s_con.status_short_label))),  
                     o_con.operation_date,  
                     o_rel.operation_date,  
                     p.pers_prospect  
                   ORDER BY  
                     date_de_relance desc,  
                     full_name asc  

 
 
Désolé pour les smileys...

Reply

Marsh Posté le 13-04-2001 à 17:39:27    

1) un select en plein milieu d'un from, ca me parait bizarre
 
2) en supposant que ca marche ca doit pas etre top rapide


---------------
Je ne suis ni pour, ni contre, bien au contraire  
Reply

Marsh Posté le 13-04-2001 à 17:48:58    

un select au milieu d'un from c'est la 1ère chose qu'on apprend à ne pas faire en cours!

Reply

Marsh Posté le 17-04-2001 à 09:40:34    

et pkoi pas ds un from ??
C plus rapide il me semble, paske geré differemment.. non ?
 
Enfin, c juste pour savoir si yavait kkun pour m'optimiser tout ca... :D

Reply

Marsh Posté le 17-04-2001 à 10:42:44    

Pourquoi personne utilise de inner?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed