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

PL/SQL Oracle Discussion :

obrenir un total au lieu d'une liste


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Points : 85
    Points
    85
    Par défaut obrenir un total au lieu d'une liste
    Bonjour,

    Il faudrait qu'à la fin de ma requête, si c'est possible, obtenir un tableau avec:
    - mon groupe
    - le nombre de partners liés pour la première fois
    - le nombre de partner liés grâce à un move to
    - le nombre de partner dégroupés

    Pour l'instant, j'ai réussi à obtenir une liste des partners avec comme commentaire
    - s'ils a été lié pour la première fois, ou s'il est issu d'un move to ou s'il a été dégroupé
    - le groupe d'où il vient
    - le groupe auquel il a été lié...

    Voici le code:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    declare
     
    LC$NB_LIAISON_PERIODE binary_integer;
    LC$NB_LIAISON_TOTALE number;
     
    -- Récupère le nombre de liaison pour une période donnée
    Cursor C_PARTNER_PER is
     
     
             select p.partner_code,p.full_name,count(*) as nb_liaison
                  from partners p, partner_groups_maintenance pgm,partners_group pg
                  where p.partner_code=pgm.partner_code
                  and pgm.group_uid=pg.group_uid
                  and pg.group_type='LEGALGRP'
                  and ((extract(year from pgm.date_stamp)=2009 and extract(month from pgm.date_stamp)=04)
                      or (extract(year from pgm.crpgm_delete_date)=2009 and extract(month from pgm.crpgm_delete_date)=04))
     
                  group by p.partner_code,p.full_name;
     
    -- Récupère le nombre de liaison totale
    Cursor C_PARTNER_TOT (LC$partner_code varchar2)is
     
           select count(*) as nb_liaison
           from partners p, partner_groups_maintenance pgm,partners_group pg
           where p.partner_code=pgm.partner_code
           and pgm.group_uid=pg.group_uid
           and pg.group_type='LEGALGRP'
           and pgm.partner_code=LC$partner_code;
     
     
     
    --Lors du "move to", récupère l'ancien UO        
    Cursor C_MOVE_FROM(LC$partner_code varchar2) is
           select pg.group_code,pg.description,pgm.crpgm_delete_user,pgm.crpgm_delete_date--,pg.description
           from partner_groups_maintenance pgm,partners_group pg
           where pgm.group_uid=pg.group_uid
           and pgm.crpgm_delete_flag='Y'
           and pg.group_type='LEGALGRP'
           and pgm.partner_code=LC$partner_code
           and pgm.crpgm_delete_date= (select max(pgm1.crpgm_delete_date)
                                             from partner_groups_maintenance pgm1,partners_group pg1
                                             where pgm1.group_uid=pg1.group_uid
                                             and pgm1.crpgm_delete_flag='Y'
                                             and pg1.group_type='LEGALGRP'
                                             and pgm1.partner_code=LC$partner_code);
     
    -- Lors du "move to", récupère le nouvel UO
    Cursor C_MOVE_TO(LC$partner_code varchar2) is
           select pg.group_code,pg.description,pgm.user_id,pgm.date_stamp--,pg.description
           from partner_groups_maintenance pgm,partners_group pg
           where pgm.group_uid=pg.group_uid
           and pgm.crpgm_delete_flag='N'
           and pg.group_type='LEGALGRP'
           and pgm.partner_code=LC$partner_code;
     
     
    --------------------------------------------------------------------------------------------------------------------------------------------
    -- Début du programme
    --------------------------------------------------------------------------------------------------------------------------------------------
     
    begin
     
    dbms_output.put_line('action;partner_code;partner_name;user;date_action;UO_from;UO_description;UO_to;UO_description');
    -- parcours de tous les partners de la table partner_groups_maintenance et calcul du nb de liaison pour une période
         for part_periode in C_PARTNER_PER loop
    -- calcul pour chacun de ces partners du nb total de liaison
    declare
    LC$FROM varchar2(50);
    LC$DESC_FROM varchar2(50);
    LC$USER_FROM varchar2(50);
    DC$DATE_FROM date;
     
    LC$TO varchar2(50):=null;
    LC$DESC_TO varchar2(50):=null;
    LC$USER_TO varchar2(50):=null;
    DC$DATE_TO date;
     
    begin
     
             open C_PARTNER_TOT(part_periode.partner_code);
             fetch C_PARTNER_TOT into LC$NB_LIAISON_TOTALE;
             close C_PARTNER_TOT;
    -- ouverture du curseur pour touver le to              
                  open C_MOVE_TO(part_periode.partner_code);
                  fetch C_MOVE_TO into LC$TO,LC$DESC_TO,LC$USER_TO,DC$DATE_TO;
                   close C_MOVE_TO;
    -- ouverture du curseur pour touver le from               
                  open C_MOVE_FROM(part_periode.partner_code);
                  fetch C_MOVE_FROM into LC$FROM,LC$DESC_FROM,LC$USER_FROM,DC$DATE_FROM;
                  close C_MOVE_FROM;
     
    -- si le nb de liaison sur la période est égale au nb de liaison total et qu'il est égal à 1, "première liaison" 
             case        
             when (LC$NB_LIAISON_TOTALE=1 and LC$TO is not null) then
                  dbms_output.put_line('première liaison;'||part_periode.partner_code||';'||part_periode.full_name||';'
                  ||LC$USER_TO||';'||DC$DATE_TO||';;;'||LC$TO||';'||LC$DESC_TO||';'||LC$NB_LIAISON_TOTALE);
     
    -- si différents (donc supérieur à 1)
     
             when (LC$TO is null) then 
     
                   dbms_output.put_line('partner dégroupé;'||part_periode.partner_code||';'||part_periode.full_name||';'
                  ||LC$USER_FROM||';'||DC$DATE_FROM||';'||LC$FROM||';'||LC$DESC_FROM);
     
             when (LC$NB_LIAISON_TOTALE>1 and LC$TO is not null)then
                  dbms_output.put_line('move to,'||part_periode.partner_code||';'||part_periode.full_name||';'||LC$USER_TO||';'||DC$DATE_TO
                  ||';'||LC$FROM||';'||LC$DESC_FROM||';'||LC$TO||';'||LC$DESC_TO||';'||LC$NB_LIAISON_TOTALE);
     
             end case;
             end;
        end loop;
     
    end;
    Est-ce que quelqu'un saurait me donner une piste pour obtenir le 1er résultat (des nombres au lieu d'une liste)?
    PS: je suis débutante en pl SQL donc il y a certainement des incohérences

    merci d'avance
    claire

  2. #2
    Membre régulier
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Points : 85
    Points
    85
    Par défaut
    reBonjour,

    j'ai tout modifier et ça me donne ç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
    49
    50
    51
    52
    begin
     
    dbms_output.put_line('UO_code;UO_description;Nb_partner_1_liaison;Nb_partner_move+;Nb_partner_degroupé;Nb_partner_move-');
    -- Récupération de la liste des UO
    for grp_uo in group_uo loop
    declare
    nb_degroupe number :=0;
    nb_moveP number :=0;
    nb_moveM number :=0;
    nb_liaison number :=0;
     
             begin
    -- Pour chaque UO, récupération de la liste des partners ayant été groupés ou dégroupés         
             for partner_uo in uo_partner(grp_uo.group_uid) loop
             declare
             LC$NB_LIAISON_TOTALE varchar2 :=0;
             LC$NB_LIAISON_VALIDE varchar2 :=0;
             begin
    --pour chaque partner, regarde le nombrede liaisons valide
                  open partner_liaison_valide(partner_uo.partner_code);
                 fetch partner_liaison_valide into LC$NB_LIAISON_VALIDE;
                 close partner_liaison_valide; 
    --pour chaque partner, regarde le nombrede liaisons totales
                 open partner_nb_liaison(partner_uo.partner_code);
                 fetch partner_nb_liaison into LC$NB_LIAISON_TOTALE;
                 close partner_nb_liaison;  
     
    --si le partner a une liaison non valide avec l'UO         
             if(partner_uo.crpgm_delete_flag ='Y') then
     
             --si il a au moin une liaison valide (avec un autre uo), partner a été dégroupé pour un autre groupe             
                  if(LC$NB_LIAISON_VALIDE>0) then
                                             nb_moveM :=nb_moveM+1;
             -- sinon le partner a été simplement dégroupé
                  else                       nb_degroupe :=nb_degroupe+1;
                  end if;
     
    -- sinon (liaison à l'Uo valide) 
              else  
              -- si le nombre total de liaison avec des UO = 1, première liaison              
                   if(LC$NB_LIAISON_TOTALE=1) then
                                              nb_liaison :=nb_liaison+1;
              --sinon partner groupé était déjà groupé avant
                   else                       nb_moveP :=nb_moveP+1;
                   end if;
     
               end if;
               end loop;
               dbms_output.put_line(grp_uo.group_code||';'||grp_uo.description||';'||nb_liaison||';'||nb_moveP||';'||nb_degroupe||';'||nb_moveM);
               end;
    end loop;
    end;
    mais il y une erreur (de syntaxe je pense) que je ne trouve pas

    Je ne sais pas si vous avez besoin des cursor pour m'aider

    merci encore
    claire

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Points : 85
    Points
    85
    Par défaut
    Voilà j'ai résolu mon bug et ça marche
    Je mets le code.

    le seul soucis est que c'est un peu long, y-a-t-il un moyen pour optimiser?

    Dans tous les cas merci

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    declare
     
    cursor group_uo is
           select *
           from partners_group pg
           where pg.delete_flag='N'
           and pg.group_type='LEGALGRP';
     
     
    cursor uo_partner(uo varchar2) is
           select *
           from partner_groups_maintenance pgm
           where pgm.group_uid=uo
           and ((extract(year from pgm.date_stamp)=2009 and extract(month from pgm.date_stamp)=04)
                      or (extract(year from pgm.crpgm_delete_date)=2009 and extract(month from pgm.crpgm_delete_date)=04));
     
    cursor partner_nb_liaison (partner_code varchar2)is
           select count(*)
           from partner_groups_maintenance pgm, partners_group pg
           where pgm.group_uid=pg.group_uid
           and pg.group_type='LEGALGRP'
           and pgm.partner_code=partner_code
           and pgm.crpgm_delete_flag='N';
     
    cursor partner_liaison_valide(partner_code varchar2)is
           select count(*)
           from partner_groups_maintenance pgm, partners_group pg
           where pgm.group_uid=pg.group_uid
           and pg.delete_flag='N'
           and pg.group_type='LEGALGRP'
           and pgm.partner_code=partner_code
           and pgm.crpgm_delete_flag='N';
     
     
     
    --------------------------------------------------------------------------------------------------------------------------------------------
    -- Début du programme
    --------------------------------------------------------------------------------------------------------------------------------------------
     
    begin
     
    dbms_output.put_line('UO_code;UO_description;Nb_partner_1_liaison;Nb_partner_move+;Nb_partner_degroupé;Nb_partner_move-');
    -- Récupération de la liste des UO
    for grp_uo in group_uo loop
        declare
        nb_degroupe number :=0;
        nb_moveP number :=0;
        nb_moveM number :=0;
        nb_liaison number :=0;
     
        begin
    -- Pour chaque UO, récupération de la liste des partners ayant été groupés ou dégroupés         
             for partner_uo in uo_partner(grp_uo.group_uid) loop
                 declare
                 LC$NB_LIAISON_TOTALE number :=0;
                 LC$NB_LIAISON_VALIDE number :=0;
                 begin
     
     
    --si le partner a une liaison non valide avec l'UO
            case         
             when(partner_uo.crpgm_delete_flag ='Y') then
    --pour chaque partner, regarde le nombrede liaisons valide
                           open partner_liaison_valide(partner_uo.partner_code);
                           fetch partner_liaison_valide into LC$NB_LIAISON_VALIDE;
                           close partner_liaison_valide;          
             --s'il a au moin une liaison valide (avec un autre uo), partner a été dégroupé pour un autre groupe             
                  if(LC$NB_LIAISON_VALIDE>0) then
                                             nb_moveM :=nb_moveM+1;
             -- sinon le partner a été simplement dégroupé
                  else                       nb_degroupe :=nb_degroupe+1;
                  end if;
     
    -- sinon (liaison à l'Uo valide) 
              else 
    --pour chaque partner, regarde le nombrede liaisons totales
                           open partner_nb_liaison(partner_uo.partner_code);
                           fetch partner_nb_liaison into LC$NB_LIAISON_TOTALE;
                           close partner_nb_liaison;  
     
              -- si le nombre total de liaison avec des UO = 1, première liaison              
                   if(LC$NB_LIAISON_TOTALE=1) then
                                              nb_liaison :=nb_liaison+1;
              --sinon partner groupé était déjà groupé avant
                   else                       nb_moveP :=nb_moveP+1;
                   end if;
     
               end case;
               end;
               end loop;
               dbms_output.put_line(grp_uo.group_code||';'||grp_uo.description||';'||nb_liaison||';'||nb_moveP||';'||nb_degroupe||';'||nb_moveM);
    end;
    end loop;
    end;

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Points : 85
    Points
    85
    Par défaut
    Bon, il y avait une erreur dans les cursor au niveau des variables (j'ai mis LC$partner_code à la place de partner_code) et ça va beaucoup mieux.

    A plus
    claire

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/05/2011, 13h44
  2. Réponses: 9
    Dernier message: 17/11/2010, 12h06
  3. [XL-2003] Réalisation d'un sous total par code sur une liste
    Par will-1981 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/05/2010, 16h37
  4. Réponses: 2
    Dernier message: 23/08/2009, 09h58
  5. [AJAX] Mots pré-écrits au lieu d'une liste
    Par jiojioforever dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 20/03/2007, 16h21

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