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 :

Oracle10 : concatener champs texte de plusieurs lignes


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 58
    Par défaut Oracle10 : concatener champs texte de plusieurs lignes
    bonjour,

    Soit les données suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    blocNote     ma_date          affaire
    aa              01/02/2007      144000
    bb              01/03/2007      144000
    cc              19/11/2007      144000
    Résultat attendu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    blocNote     ma_date          affaire
    aa bb cc     19/11/2007      144000

    Je souhaite obtenir 1 seule ligne en prenant le max de la date et en concaténant tous mes BlocNotes (avec un espace entre chaque....).

    Pour la date, je pense pouvoir utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    max(MA_DATE) over(partition by affaire)
    Mais comment faire pour concatener les valeurs de blocnote de chaque ligne ?


    Si quelqu'un a une idée, ce serait cool !

    Merci d'avance !

  2. #2
    Membre éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    A mon avis, il faut que passes par du PlSql et utilser un curseur

    LBO72

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 58
    Par défaut
    ok...

    domage que cela ne puisse pas se faire dans un select avec une fonction analytique...

    Merci quand même.

    Je reste ouverte à d'autres idées.

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Essaie ce code, mais il faut changer le nom de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT     SUBSTR (SYS_CONNECT_BY_PATH (blocnote, ' '), 2) name_list, ma_date
          FROM 
        (SELECT blocnote, affaire, COUNT (*) OVER (PARTITION BY affaire) cnt,
                       MAX (ma_date) OVER (PARTITION BY affaire) ma_date,
                       ROW_NUMBER()OVER(PARTITION BY AFFAIRE ORDER BY blocnote) seq
                  FROM note_tab
                 WHERE blocnote IS NOT NULL)                             
    WHERE seq = cnt
    START WITH seq = 1
    CONNECT BY PRIOR seq + 1 = seq AND PRIOR affaire = affaire;

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Non ça ne marche pas
    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
     
    create table t_p
    (
      blocNote     varchar2(2),
      ma_date      date,
      affaire      Number(6)
    )
    /
     
    insert into t_p values('aa','01/02/2007',144000);
    insert into t_p values('bb','01/03/2007',144000);
    insert into t_p values('cc','19/11/2007',144000);
    insert into t_p values('cc','19/11/2007',144001);
    insert into t_p values('dd','19/11/2007',144001);
    insert into t_p values('ee','10/12/2007',144001);
    /
    SELECT SUBSTR (SYS_CONNECT_BY_PATH (blocnote, ' '), 2) name_list, ma_date
          FROM (SELECT blocnote, affaire, COUNT (*) OVER (PARTITION BY affaire) cnt,
                       MAX (ma_date) OVER (PARTITION BY affaire) ma_date,
                       ROWNUM seq
                  FROM t_p
                 WHERE blocnote IS NOT NULL)
         WHERE seq = cnt
    START WITH seq = 1
    CONNECT BY PRIOR seq + 1 = seq AND PRIOR affaire = affaire
    /
     
    NAME_LIST
    -----------------------------------------
     
    MA_DATE
    --------
    aa bb cc
    19/11/07
    Par contre cette solution marche si tu connais d'avance le max(blocnote) group by affaire. Sinon, des autres solutions sont envisageable (y compris celles similaire à la proposition de salim11, valable à partir d'Oracle 10 seulement)
    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
     
    Select affaire, max(ma_date),
           max(decode(seq,1,blocnote,null)),
           max(decode(seq,2,blocnote,null)),
           max(decode(seq,3,blocnote,null))
    from (
      select affaire, ma_date, blocnote, row_number() over (partition by affaire order by ma_date) seq
      from t_p)
    where seq <= 3
    group by affaire
    /
       AFFAIRE MAX(MA_D MA MA MA
    ---------- -------- -- -- --
        144000 19/11/07 aa bb cc
        144001 10/12/07 cc dd ee

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Merci pour ta remarque, mais j'ai corrigé ma requête même avant que tu post ton code .

    Voici la démonstration que ça marche bien
    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
     
    SQL>  SELECT   affaire,  SUBSTR (SYS_CONNECT_BY_PATH (blocnote, ' '), 2) name_list, ma_date
      2         FROM
      3       (SELECT blocnote, affaire, COUNT (*) OVER (PARTITION BY affaire) cnt,
      4                      MAX (ma_date) OVER (PARTITION BY affaire) ma_date,
      5                      ROW_NUMBER()OVER(PARTITION BY AFFAIRE ORDER BY blocnote) seq
      6                 FROM t_p
      7                WHERE blocnote IS NOT NULL)
      8   WHERE seq = cnt
      9   START WITH seq = 1
     10   CONNECT BY PRIOR seq + 1 = seq AND PRIOR affaire = affaire;
     
            AFFAIRE NAME_LIST                               MA_DATE
    -------------- ---------------------------------------- ------------
            144000 aa bb cc                                 19/11/2007
            144001 cc dd ee                                 10/12/2007
     
    SQL>

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

Discussions similaires

  1. Champ text avec plusieurs lignes ?
    Par Death83 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 17/10/2006, 11h42
  2. 8i : sql loader et champ texte sur plusieurs lignes
    Par naonedboy dans le forum SQL*Loader
    Réponses: 1
    Dernier message: 23/11/2005, 10h07
  3. [JButton] Texte sur plusieurs lignes
    Par leminipouce dans le forum Composants
    Réponses: 5
    Dernier message: 19/10/2005, 10h17
  4. [CR10 ]un texte sur plusieurs lignes?
    Par speed034 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 28/09/2005, 07h26
  5. Réponses: 2
    Dernier message: 21/09/2005, 12h18

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