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 :

Afficher les colonnes en ligne


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé
    Afficher les colonnes en ligne
    Bonjour,

    J'ai construit une requête SQL qui me renvoie par ligne , une date , un nom de participant , un indicateur de type numérique présent le matin , un indicateur de type numérique présent l'après midi.

    Exemple : 25/10/2011 TOTO 1 0 , pour dire toto présent le matin du 25/10/2011

    Par jour je n'ai pas forcément les mêmes participants , soit le 26/10/201 j'ai TITI présent l'après midi.

    Je dois à présent représenter cela sous forme de table , par ligne l'ensemble des mes participants et par colonne mes jours

    Exemple :
    PARTICIPANT | DATE 1 - MATIN | DATE 1 APMIDI |DATE 2 - MATIN | DATE 2 APMIDI
    
    TOTO                X                                       
    TITI                                                                                            X
    Pour précision je suis en version 10G d'oracle.

    j'ai trouvé cela , et appliqué , seulement tout est dans la même colonne...

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    COLUMN employees FORMAT A50
     
    SELECT deptno, wm_concat(ename) AS employees
    FROM   emp
    GROUP BY deptno;
     
        DEPTNO EMPLOYEES
    ---------- --------------------------------------------------
            10 CLARK,KING,MILLER
            20 SMITH,FORD,ADAMS,SCOTT,JONES
            30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
     
    3 rows selected.

    Est-ce que quelqu'un a une idée sur la façon de procéder ?

  2. #2
    Membre averti
    Bonjour,

    Je me suis déjà heurté à ce problème et me suis inspiré de cet article :

    http://www.orafaq.com/node/1871

    Cdlt,
    LBO72.

  3. #3
    Membre expérimenté
    Avant 9i (et après aussi mais c'est du spécifique Oracle) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select ename ,
           decode( deptno, 10, 'X', null )  dept_10,
           decode( deptno, 20, 'X', null )  dept_20,
           decode( deptno, 30, 'X', null )  dept_30,
           decode( deptno, 40, 'X', null )  dept_40
    from emp ;


    A partir de la 9i

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select ename ,
           case when deptno = 10 then 'X' else null end  dept_10,
           case when deptno = 20 then 'X' else null end  dept_20,
           case when deptno = 30 then 'X' else null end  dept_30,
           case when deptno = 40 then 'X' else null end  dept_40
    from emp ;

  4. #4
    Membre éprouvé
    Bonsoir,

    j'ai laissé tombé et j'ai revu ma copie , impossible de trouver quelque chose via SQL d'assez dynamique pour satisfaire mon besoin

  5. #5
    Membre expérimenté
    c'est génial la fonction wm_concat que tu as découvert.
    "shaun_the_sheep"
    auparavant j'utilisais la génération du XML puis extraction pour que je transpose des lignes en une colonne. cette dernière est gourmande en termes de mémoire et de temps.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  6. #6
    Membre chevronné
    Ce sujet a eu un sacré succès : "Affichages: 2 095" au 25/04 à 10h00
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  7. #7
    Modérateur

    C'est un sujet ouvert il y a sept ans.

    Attention à tous, la fonction wm_concat n'est pas officiellement supportée par Oracle, vous ne la trouverez pas dans la documentation.
    Si vous avez un incident de prod en utilisant cette fonction, le support Oracle pourra se cacher derrière le fait que vous n'êtes pas censé l'utiliser.

    De plus, à partir de la version 11gR2, la fonction listagg fait le même travail et c'est une fonction documentée :
    https://docs.oracle.com/cloud/latest...htm#SQLRF30030

  8. #8
    Membre chevronné
    OK, je comprends mieux
    Et effectivement je ne voyais pas l'avantage par rapport à LISTAGG; je comprends maintenant pourquoi.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  9. #9
    Expert éminent
    2 Choses :
    LISTAGG retourne un VARCHAR2 de 2000 max.. Si la concaténation dépasse les 2000 car, erreur ORA-01489: result of string concatenation is too long (et inutile de faire un SUBSTR sur la fonction.. c'est à l'intérieur de la fonction que ça plante)
    WM_CONCAT retourne un CLOB (pas de limite donc ou alors très très élevée )

    En 12.2 je n'ai plus de fonction WMSYS.WM_CONCAT, vous confirmez ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  10. #10
    Membre éprouvé
    Bonjour

    Effectivement c'est pas récent.
    J'ai pas appliqué cette méthode je me suis orienté sur la construction d'un pivot

###raw>template_hook.ano_emploi###