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

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : janvier 2014
    Messages : 7
    Points : 6
    Points
    6

    Par défaut Pivoter les données d'un champ

    Bonjour,

    J’ai une table qui contient 2 champs (NUM_RUM varchar, DIAG varchar).
    La donnée est contenue dans la table de la façon suivante :

    NUM_RUM | DIAG
    XXXXX1 | YYY1 YYY2 YYY3 YYY4
    XXXXX2 | Y1YY Y2YY Y3YY
    XXXXX3 | 1YYY 2YYY


    Je cherche à extraire l’infos du champ DIAG de manière à avoir çà dans une autre table :

    NUM_RUM | DIAG
    XXXXX1 | YYY1
    XXXXX1 | YYY2
    XXXXX1 | YYY3
    XXXXX1 | YYY4
    XXXXX2 | Y1YY
    XXXXX2 | Y2YY
    XXXXX2 | Y3YY
    XXXXX3 | 1YYY
    XXXXX3 | 2YYY


    La taille du champ DIAG est fixe et l’espace entre chacune des données d’un champ est fixe également… Ce qui m’agace c’est que je ne vois pas quelle fonction ou transformation utiliser. Le REVERSE_PIVOT n’est pas possible vu que le contenu du champ DIAG est variable d’une ligne à une autre… Avez vous une idée ?

  2. #2
    Membre du Club
    Inscrit en
    décembre 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 27
    Points : 51
    Points
    51

    Par défaut

    Si jamais tu connais le nombre max d’occurrence dans ton champ DIAG et qu'il est raisonnable, tu peux découper le champ en plusieurs colonnes dans une query avec la fonction word:
    Colonne_1: word(DIAG,1)
    Colonne_2: word(DIAG,2)
    etc

    Ensuite tu devrais pouvoir faire un PIVOT (plutôt qu'un reverse_pivot) puis il restera à filtrer les valeurs nulles.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : janvier 2014
    Messages : 7
    Points : 6
    Points
    6

    Par défaut

    Bonjour,

    Déjà, je tiens à m'excuser car je m'étais un peu trompé sur l'explication... En fait la table est comme ceci

    NUM_RUM | NBRE_DIAG | DIAG

    XXX1 | 3 | YDY701DDD002UUU003ZZZ007SS S108HYYY4093FFF A8881HHGF99 998876890653424HTY YEZ
    XXX2 | 3 | NFJNSGYG4445NJNLN23L2K9NNKVGFE8YNFJ4ZO84BJBKNK5Y7YZA 4 K4UH4UY7U KK4U77984 666RE
    XXX3 | 2 | 98JIKN34UY64JBBEVDEY3T6AA7 V EHJA64RBBRFA HJE7FAD54Z

    Et j'aimerai la décomposer ainsi:

    NUM_RUM | DIAG

    XXX1 | YDY701DDD002UUU003ZZZ007SS
    XXX1 | S108HYYY4093FFF A8881HHGF
    XXX1 | 99 998876890653424HTY YEZ
    XXX2 | NFJNSGYG4445NJNLN23L2K9NNK
    XXX2 | VGFE8YNFJ4ZO84BJBKNK5Y7YZA
    XXX2 | 4 K4UH4UY7U KK4U77984 666
    XXX2 | 666RE
    XXX3 | 98JIKN34UY64JBBEVDEY3T6AA7
    XXX3 | V EHJA64RBBRFA HJE7FAD54Z

    Le champ est de type varchar et la taille maximum du champ est de 3900 bytes. Un diagnostique étant codé sur 26 caractères, je dois extraire pour chaque NUM_RUM les "n" DIAG qu'il y a dans le champs DIAG.

    J'ai donc procédé ainsi:

    1- création d'une variable $NbRowMax de type int.
    $NbRowMax = sql('SID_ALIM', 'SELECT MAX(NBRE_DIAG)-1 FROM SID_ALIM.T_EXTRACT_FLAT_FILE');

    2- mise en place d'un flux qui se décompose ainsi:

    En source, j'ai
    - un Row_Génération (Row number starts at : 0, Rows count: $NbRowMax)
    - ma table

    Une querry qui va avoir 2 champs:
    - NUM_RUM
    - DIAG codé comme ceci : substr(T_EXTRACT_FLAT_FILE.DIAG, 1 + Row_Generation.DI_ROW_ID * 26, 26)



    Après exécution du flux, j'obtiens ceci dans la table cible:

    NUM_RUM | DIAG

    XXX1 | YDY701DDD002UUU003ZZZ007SS
    XXX1 | S108HYYY4093FFF A8881HHGF
    XXX1 | 99 998876890653424HTY YEZ
    XXX2 | YDY701DDD002UUU003ZZZ007SS
    XXX2 | S108HYYY4093FFF A8881HHGF
    XXX2 | 99 998876890653424HTY YEZ
    XXX3 | YDY701DDD002UUU003ZZZ007SS
    XXX3 | S108HYYY4093FFF A8881HHGF
    XXX3 | 99 998876890653424HTY YEZ

    Il extrait bien les 26 caractères sauf qu'il va dupliquer les caractères de la 1ère ligne.
    Avez vous une idée?

    Merci d'avance

  4. #4
    Membre du Club
    Inscrit en
    décembre 2008
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 27
    Points : 51
    Points
    51

    Par défaut

    Déjà c'est une bonne idée de procéder ainsi

    Juste une petite remarque sur les données, pour XXX2 le champ NBRE_DIAG ne devrait-il pas valoir 4? Car dans le résultat tu obtient 4 lignes pour XXX2 .

    Ensuite je ne vois pas d’où viens le problème, ton résonnement est bon. Un bug?
    J'ai donc reproduit le traitement chez moi et j’obtiens le bon résultat, voici ce que j'ai fais si ça peut t'aider à trouver ton erreur si il y en a une:

    Nom : Verif1.JPG
Affichages : 50
Taille : 24,8 Ko
    Nom : Verif2.JPG
Affichages : 53
Taille : 9,6 Ko
    Nom : Verif3.JPG
Affichages : 51
Taille : 43,8 Ko
    Nom : Verif4.JPG
Affichages : 47
Taille : 31,6 Ko

    Sinon j'ai un doute sur ton max-1, j'aurais plutôt mis max quand tu calcule la variable pour le row_generation, moi j'ai mis directement row_count à 4 et il génère de 0 à 3.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    janvier 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : janvier 2014
    Messages : 7
    Points : 6
    Points
    6

    Par défaut

    Tout à fait, c'est bien 4 lignes que l'on obtient.
    C'est moi qui ait omis la ligne lors de mon copier/coller.
    J'ai refait des tests avec d'autres données et le flux a bien fonctionné en effet.
    J'ai donc été plus loin dans mon analyse et j'ai pu constaté que c'était en fait 3 lignes de données corrompues dans le fichier plat que j'exploitais, qui posaient problème.

    Merci mapk0

Discussions similaires

  1. Réponses: 10
    Dernier message: 13/08/2007, 16h12
  2. Afficher les données de deux champs différents
    Par egg3774 dans le forum IHM
    Réponses: 3
    Dernier message: 28/07/2007, 02h21
  3. Réponses: 10
    Dernier message: 19/03/2007, 12h42
  4. Afficher les données d'un champ sur une ligne
    Par white-angel dans le forum Access
    Réponses: 6
    Dernier message: 30/08/2006, 11h09
  5. IBQuery : propriété contenant les données du 1er champ
    Par Harry dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/09/2005, 22h58

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