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 :

Déplacement de données dans cellules vides [11gR2]


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Déplacement de données dans cellules vides
    Bonjour,

    Débutant sur ORACLE, je me permets de vous demander un peu d'aide sur la façon dont je peux déplacer les données de chaque ligne dans les cellules vides.
    Je m'explique, j'ai crée un script qui me permet d'alimenter une table. Jusque là, tout va bien!
    Cette table dispose de plusieurs enregistrements et toutes les colonnes de fin (en gros toutes les colonnes de droites) ne sont pas vide. Je souhaiterai pouvoir déplacer ces données qui se situent à droites dans les colonnes de gauches. Le problème est que la table dispose d'une vingtaine de colonne et chaque ligne ne dispose pas du même nombre d'entrées.
    Pour être plus clair, voici un exemple :

    UO1 UO2 UO3 UO4 UO5 UO6 UO7 UO8 UO9 UO10
    a b c d e f g h
    a b c d e
    a b c d e f g h i
    a b
    a b c d e f g h i j

    Ce que je souhaite obtenir dans la mesure du possible :

    UO1 UO2 UO3 UO4 UO5 UO6 UO7 UO8 UO9 UO10
    a b c d e f g h
    a b c d e
    a b c d e f g h i
    a b
    a b c d e f g h i j

    En complément d'information, le type de ces colonnes sont toutes en "NUMBER(15)". Je ne sais pas si ça peut aider.

    Merci par avance pour votre aide.

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Salut,

    Est-ce qu'il ne serait pas plus simple de modifier le script de départ plutôt que de créer un nouveau script pour corriger la situation posant problème?

    Si ta table comporte 20 colonnes, alors construit un ordre INSERT sous forme de chaine de caractère du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO TABLE VALUES (,,,,,,,,,,,,,,)"
    en mettant en premier les valeurs qui sont renseignées puis tu complètes jusqu'au nombre max de colonnes par des NULL puis tu exécutes cet ordre SQL dynamique.

    Par exemple j'imagine un fichier de données en entrée avec :
    a b c d
    a b c
    a b c d e f g h
    alors je fais une boucle pour récupérer chaque donnée de chaque ligne : soit a puis b puis c puis d pour la ligne 1.
    Ensuite, comme je sais qu'il y a 20 colonnes par exemple dans ma table, je complète ma chaine de caractères avec 16 fois la valeur NULL dans cet exemple : ma variable V_CHAINE vaut "INSERT INTO TABLE VALUES('a', 'b', 'c', 'd', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)" et je fais un EXECUTE IMMEDIATE V_CHAINE;

    Et je continue comme ça en traitant chaque ligne.
    Ce sera je pense beaucoup plus simple que de partir de la table dont tu parles.
    En tout cas je ne vois pas comment faire avec une commande SQL simple; tu seras obligé de faire du PL/SQL.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    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 786
    Points
    30 786
    Par défaut
    Ce n'est sans doute pas le plus efficace mais tu peux pratiquer une normalisation / dénormalisation de ta table.
    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
    WITH    src
        AS  (   SELECT  Id
                    ,   1       AS  Col
                    ,   UO1     AS  Val
                FROM    matable
                WHERE   UO1     IS NOT NULL
            UNION ALL
                ...
            UNION ALL
                SELECT  Id
                    ,   10      AS  Col
                    ,   UO10    AS  Val
                FROM    matable
                WHERE   UO10    IS NOT NULL
            )
        ,   rnk
        AS  (   SELECT  Id
                    ,   Val
                    ,   ROW_NUMBER()    OVER (PARTITION BY Id   ORDER BY Col)   AS  Rnk
                FROM    src
            )
    SELECT  Id
        ,   MAX(CASE Rnk WHEN 1     THEN Val END)   AS  UO1
        ,   ...
        ,   MAX(CASE Rnk WHEN 10    THEN Val END)  AS  UO10
    FROM    rnk
    GROUP BY Id
    Ceci bien sûr ne fonctionne que si tu as un identifiant unique (nommé ici Id) pour chaque ligne de la table
    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.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Merci
    Merci pour votre aide.
    J'ai fini par utiliser un curseur qui m'a remis "carré" ma table.
    C'est un peu plus lourd mais le résultat est là.
    Encore merci pour vos réponses.

  5. #5
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Est-ce qu'on peut voir le code de ton curseur?
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

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

Discussions similaires

  1. [Toutes versions] Problème d'actualisation données dans cellule
    Par mika7176 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 30/06/2011, 23h08
  2. [XL-2003] créer msgbox pour insertion données dans cellule
    Par gaihdriah dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/05/2009, 16h53
  3. Réponses: 5
    Dernier message: 25/03/2009, 01h58
  4. Déplacement de données dans la meme table
    Par tulipeverte dans le forum Requêtes
    Réponses: 13
    Dernier message: 06/03/2008, 18h15
  5. Excel (long. données dans cellule) vers ASP
    Par Australia dans le forum ASP
    Réponses: 9
    Dernier message: 12/09/2006, 17h38

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