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 :

Comment concaténer une à N ligne(s) en SQL [12c]


Sujet :

PL/SQL Oracle

  1. #1
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut Comment concaténer une à N ligne(s) en SQL
    Bonjour à tous,

    Si l'on regarde le résultat de ma requête ci-dessous, ce sont les valeurs de la colonne SZINHALT que j'ai surligné en verre que je dois concaténer selon une certaines méthode que je vais vous expliquer ci-dessous.
    Nom : IMG1.png
Affichages : 790
Taille : 24,8 Ko

    Comme vous pouvez le voir, j'ai encadré en rouge les divers éléments à concaténer. En fait, si nous prenons par exemple les 3 premières lignes, voici le résultat que je souhaiterais avoir : "ANNULE OU REMBOURSE"
    Pour le deuxième encadré : "PLUS DE PASSAGE"
    Pour le troisième encadré : "EXPIRE DEPUIS: %d, %d, %d"
    Pour le quatrième encadré : " HORS SERVICE"
    Pour le cinquième : "FORFAIT EXPIRE DEPUIS: %02d:%02d"
    Enfin pour le dernier encadré : "PAS ENCORE VALABLE"

    Je travail avec 3 tables pour avoir le résultat obtenu ci-dessus (cf capture d'écran ci-dessus)
    Voici comment je pourrais nomer ces tables SQL :
    1. EVENEMENT
    2. TEXTE
    3. CONFIG : N° DES TEXTES + N° DES LIGNES DES TEXTES A CONCATENER


    Je dois sortir 1 ligne par EVENEMENT avec son texte correspondant et pour avoir ces textes correspondant je dois passer la ta table CONFIG où il y a les numéros des textes et les numéros des lignes de textes à concaténer.

    Finalement, je dois donc faire de la concaténation via la table de CONFIG et c'est la tout mon questionnement. Voici les deux colones sur lesquelles je dois travailler.
    Nom : IMG2.png
Affichages : 702
Taille : 7,5 Ko

    En fait sur l'image que vous voyez juste ci-dessus j'ai deux colonnes. Je dois concaténer les valeurs de droites dans un ordre croissant et ce, seulement si la valeur de gauche correspond. J'ai surligné pour vous aider à comprendre le raisonnement.
    par exemple si on prend les lignes ou sur la première colonne c'est noté 9 cela doit se transformer comme ça :
    Nom : IMG3.png
Affichages : 685
Taille : 3,8 Ko
    Le 0, le 1, et le 2 correspondent en fait au différent texte encadré en rouge sur ma première capture d'écran.

    je vais désormais vous montrer à quoi ressemble ma requête actuel ainsi que son résultat.

    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
    SELECT
      TABSONDERFALLSIGNAL.SZNAME, /* TABLE EVENEMENT */
      TABSONDERFALLSIGNAL.NLAMPENCODEGRUEN AS VERT, /* EVENT CODE VERT */
      TABSONDERFALLSIGNAL.NLAMPENCODEROT AS ROUGE, /* EVENT CODE ROUGE */
      TABSONDERFALLSIGNAL.NLAMPENCODEGELB AS JAUNE, /* EVENT CODE JAUNE */
      TABDISPLAYTEXTE.SZINHALT /* TABLE TEXTE */
    FROM
      TABSONDERFALLSIGNAL
    INNER JOIN 
      TABDISPLAYTEXTSONDERFALL /* TABLE CONFIG AVEC LES NUMEROS  / EN GROS 1 NUMERO = 1 TEXTE */
    ON 
      TABSONDERFALLSIGNAL.NSONDERFALLCODE = TABDISPLAYTEXTSONDERFALL.NSONDERFALLCODE
      /* CONCATENATION ICI JE PENSE */
    INNER JOIN 
      TABDISPLAYTEXTE
    ON 
      TABDISPLAYTEXTSONDERFALL.NDISPLAYTEXTNR = TABDISPLAYTEXTE.NDISPLAYTEXTNR;
    Résultat :
    Nom : IMG4.png
Affichages : 694
Taille : 20,9 Ko

    Pouvez-vous m'aider à résoudre ce problème en me donnant des pistes à suivre ?
    Je vous remercie tous par avance pour votre aide.

    Bonne journée,
    Bien Cordialement,
    Martin

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 821
    Points
    30 821
    Par défaut
    La fonction LISTAGG devrait t'aider.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Oui tu as juste à faire un LISTAGG :

    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
    SELECT
      TABSONDERFALLSIGNAL.SZNAME, /* TABLE EVENEMENT */
      TABSONDERFALLSIGNAL.NLAMPENCODEGRUEN AS VERT, /* EVENT CODE VERT */
      TABSONDERFALLSIGNAL.NLAMPENCODEROT AS ROUGE, /* EVENT CODE ROUGE */
      TABSONDERFALLSIGNAL.NLAMPENCODEGELB AS JAUNE, /* EVENT CODE JAUNE */
      LISTAGG(TABDISPLAYTEXTE.SZINHALT, ' ') WITHIN GROUP (ORDER BY TABDISPLAYTEXTE.NDISPLAYTEXTNR)  /* TABLE TEXTE */
    FROM
      TABSONDERFALLSIGNAL
    INNER JOIN 
      TABDISPLAYTEXTSONDERFALL /* TABLE CONFIG AVEC LES NUMEROS  / EN GROS 1 NUMERO = 1 TEXTE */
    ON 
      TABSONDERFALLSIGNAL.NSONDERFALLCODE = TABDISPLAYTEXTSONDERFALL.NSONDERFALLCODE
      /* CONCATENATION ICI JE PENSE */
    INNER JOIN 
      TABDISPLAYTEXTE
    ON 
      TABDISPLAYTEXTSONDERFALL.NDISPLAYTEXTNR = TABDISPLAYTEXTE.NDISPLAYTEXTNR
    GROUP BY TABSONDERFALLSIGNAL.SZNAME,
      TABSONDERFALLSIGNAL.NLAMPENCODEGRUEN,
      TABSONDERFALLSIGNAL.NLAMPENCODEROT,
      TABSONDERFALLSIGNAL.NLAMPENCODEGELB
    ;
    Par contre dans ton résultat attendu les textes doublons disparaissent, la requête doit gérée ça aussi?

  4. #4
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Merci pour vos réponses. La requête est parfaite !

    C'est donc résolu.

    Bonne journée
    Cordialement,

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 28/10/2010, 17h26
  2. Comment lire une seul ligne d'un fichier texte?
    Par Julien1987 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/01/2007, 13h36
  3. Réponses: 10
    Dernier message: 30/11/2006, 23h06
  4. [C# 2.0] Comment créer une table sur un serveur SQL 2000 ?
    Par Filippo dans le forum Accès aux données
    Réponses: 1
    Dernier message: 15/09/2006, 13h30
  5. Réponses: 2
    Dernier message: 07/12/2005, 16h26

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