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 :

tableau dynamique croisé


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2006
    Messages : 107
    Par défaut tableau dynamique croisé
    Bonjour,

    J'aimerai faire un tableau dynamique croisé, explications
    J'ai une table qui contient deux FK:
    Table_Principale
    {clé,
    fk_1,
    fk_2}

    Table_1
    {fk_1
    libelle_1}

    Table_2
    {fk_2
    libelle_2}

    mon but est d'avoir une présentation en tableau dynamique croisé
    Avec les lignes qui correspondent au contenu de ma table 1
    et les colonnes qui correspondent au contenu de ma table 2

    en gros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ****   |lib_2a | lib_2a | total
    _______________________________
    lib_1a |  sum  |   sum  | count
    _______________________________
    lib_1b |  sum  |   sum  | count
    si le contenu de ma table 2 serait fixe ca serait facile il suffirait de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select 
        sum(decode(fk_2,fk_2a,1,0)) 'lib_2a',
        sum(decode(fk_2,fk_2b,1,0)) 'lib_2b',
        count(fk_1) TOTAL
    from table_principale P,table_1 1, table_1 2 
    where P.fk_1 = 1.fk_1, P.fk_2 = 2.fk_2
    group by   P.fk_1
    Seulement ce n'est pas le cas, et je voudrais que ma requête fonctionne même si des enregistrements sont insérer dans la table 2

    Je pense qu'il est facile de générer la requête en sql dynamique par contre mon problème est comment récupérer le résultat dans un curseur générique ...
    Il me semble que c'est impossible (Source SQL Dynamique : sheikyerbouti)

    Pensez-vous a une autre solution ?

  2. #2
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Oui tu as raison, la seule manière de faire des tableaux croisés est de passer par des curseurs dynamiques. Voici un exemple ultra basique d'apppel de procédure avec curseur dynamique par SQL*PLUS:

    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
     
    SQL> create or replace procedure p_test (p_cur out sys_refcursor) is
      2  chaine varchar2(1000);
      3  BEGIN
      4  chaine := 'select * ';
      5  chaine := chaine || 'from cat where rownum < 5';
      6  open p_cur for chaine;
      7  END;
      8  /
     
    Procédure créée.
     
    SQL> var cc REFCURSOR
    SQL> BEGIN 
      2  p_test(:cc);
      3  END;
      4  /
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> print CC
     
    TABLE_NAME                     TABLE_TYPE
    ------------------------------ -----------
    ANNEES                         TABLE
    BIN$MbM0f3K08KDgQ6wVBCPwoA==$0 TABLE
    BIN$McY95vBl0CTgQ6wVBCPQJA==$0 TABLE
    BIN$McbTtDbYsKLgQ6wVBCOwog==$0 TABLE

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2006
    Messages : 107
    Par défaut
    Ok

    pour info voici le code de ma procédure :

    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
    procedure ps_call_product_state(ICallListCursor out GenericCursor) is
     
    cursor cState is
    select PK_STATE, LABEL
    from HDCALLSTAT
    where HDCALLSTAT.ACTIVE = 'O'
    order by HDCALLSTAT.CALL_ORDER;
     
    num_pk_state HDCALLSTAT.PK_STATE%TYPE;
    str_label HDCALLSTAT.LABEL%TYPE;
     
    str_requete varchar2(2000);
     
    BEGIN
     
     
     
       str_requete := 'select HDPRODUCT.PRODUCT_NAME,';
       open  cState;
       loop 
       fetch cState into  num_pk_state,str_label;
            Exit When cState%NOTFOUND ; -- sortie lorsque le curseur ne ramène plus de ligne
            str_requete := str_requete||' sum(decode(FK_STATE,'||num_pk_state||',1,0)) "'||str_label||'",';        
       End loop ; 
       str_requete := str_requete||'count(FK_PRODUCT) "Total" ';
       str_requete := str_requete||'from HDCALL,HDPRODUCT ';
       str_requete := str_requete||'where HDCALL.FK_PRODUCT =  HDPRODUCT.PK_PRODUCT ';
       str_requete := str_requete||'group by HDPRODUCT.PRODUCT_NAME ';
     
     
        execute immediate 'alter session set cursor_sharing=force';
        open ICallListCursor for str_requete;
        execute immediate 'alter session set cursor_sharing=exact';
     
     
        exception
     
    when others then
          pck_log.PS_LOG_ERROR (c_pckname || '. ps_call_product_state',sqlcode, sqlerrm);
             raise_application_error(-20000,sqlerrm);  
     
    END ps_call_product_state;

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2006
    Messages : 107
    Par défaut
    Les deux alter session sont sensé amélioré la rapidement du traitement, quelqu'un peut-il me le confirmer ?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/09/2008, 13h46
  2. Réponses: 4
    Dernier message: 03/03/2008, 15h44
  3. Tableau Dynamique croisé sous SQL server
    Par bibi5883 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 10/01/2008, 17h20
  4. Tableau dynamique croisé
    Par THOMAS33600 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/10/2007, 21h58
  5. [VBA-E]Afficher tout dans un tableau dynamique croisé
    Par alex_95 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/03/2006, 13h09

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