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

Langage SQL Discussion :

Changement de structure d'une table


Sujet :

Langage SQL

  1. #1
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut Changement de structure d'une table
    Bonjour,

    je travaille sous SAS et j'aimerais pouvoir passer d'une table de cette forme :

    A 1947 1948 1948 1949 1950
    B 1974 1974 1974 1998 1999
    B 2000 2001 . . .
    C 1956 1958 1975 1976 1978

    à une table de cette forme

    A 1947 1948 1949 1950
    B 1974 1998 1999 2000 2001
    C 1956 1958 1978 1976 1978

    En gros, les lignes à même identifiant, (ici A B ou C) je voudrais pouvoir les mettre sur une seule et même ligne. Ca c'est la grosse partie du boulot. Après, dans la mesure du possible, j'aimerais pouvoir enlever les doublons et ordonner celle-ci.

    Comme je ne vois pas de solution avec les instructions classiques de SAS, je me suis dit qu'il existait peut-être une chance que SQL me sorte de ce mauvais pas... (SAS intègre la possibilité de faire du SQL via des "proc SQL" mais je ne sais pas quel est le niveau de SQL qu'on peut y intégrer...)

    Le premier problème c'est qu'il faut pouvoir créer autant de variables (ou colonnes) qu'il n'y a de valeurs différentes pour une observation d'un même identifiant.
    Le deuxième c'est qu'il faut pouvoir repérer les différents identifiants (SELECT distinct Ident ?) pour prendre les bonnes informations et les coller dans la même ligne.


    Si quelqu'un avait ne serait-ce qu'une petite idée pour amorcer le dédoublonnage de la table, peut-être que ça pourrait me lancer, car pour l'instant, j'avoue être un peu coincé...

    Merci de m'avoir lu et bonne journée

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 096
    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 096
    Points : 28 394
    Points
    28 394
    Par défaut
    Quelle est exactement la structure de ta 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.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    J'espère que je ne me trompe pas sur le sens de "structure"...
    En fait ma table est rectangulaire, car dans SAS, il ne peut y avoir que des tables rectangulaires avec nombre de lignes et de colonnes fixes. Les valeurs manquantes sont donc complétées par des points.

    Donc ma table de départ est composée de 51 variables avec 10 000 lignes (je schématise)

    La première variable est une variable texte qui représente l'identifiant (ex : A, B, C), et les 50 suivantes sont des variables dans lesquelles on indique une année. Pour un individu X, il pourra avoir de 1 à n valeurs remplies dans le tableau. Si n est supérieur à 50, il aura plusieurs lignes dans son tableau.

    Dans l'exemple que j'avais donné lors de ma première explication, l'individu B avait trop de valeurs à remplir donc il occupait deux lignes (dont une incomplète).

    L'idée est d'avoir un tableau plus grand en "largeur" (nombre de variables) et plus petit en longueur (nombre de lignes d'observations) en regroupant toutes les informations connues pour un même identifiant. Peu importe si ce tableau, du coup, contiendra beaucoup de valeurs manquantes.

    J'espère que j'ai répondu à la question

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 096
    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 096
    Points : 28 394
    Points
    28 394
    Par défaut
    En SQL, je ferais comme ça (normalisation puis dénormalisation) :
    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
    select    ID
        ,    sum(case COL when 1 then VAL else 0 end)
        ,    ...
        ,    sum(case COL when :M - 1 then VAL else 0 end)
        ,    sum(case COL when 0 then VAL else 0 end)
    from
        (    select    ID
                ,    rownumber() over (partition by ID order by VAL) as ORD
                ,    cast((ORD / :M) as integer) as LIG
                ,    ORD - LIG * :M as COL
                ,    VAL
            from
                (    select    ID
                        ,    VAL1    as VAL
                    from    MATABLE
                union
                    ...
                union
                    select    ID
                        ,    VAL_N    as VAL
                    from    MATABLE
                )
        )
    group by ID, LIG
    ;
    N est le nombre de colonnes (hors ID) de ta table source, M celui de la tale cible
    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.

  5. #5
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Merci pour cette réponse rapide !

    J'essaie pour l'instant de voir qu'est-ce qu'elle fait réellement, j'avoue ne pas tout saisir donc je vais chercher un peu et je reviendrai (surement) poser quelques questions

  6. #6
    Membre averti
    Inscrit en
    Juillet 2006
    Messages
    366
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 366
    Points : 324
    Points
    324
    Par défaut
    Je cogite je cogite et... je vois toujours pas qu'est-ce que peuvent renvoyer les sum de d"but de programme... De plus il faut en créer M c'est bien ça ?

    D'autre part il semble que le SQL sous SAS n'accepte pas le "over"

Discussions similaires

  1. Changement de la structure d'une table
    Par Bouajina dans le forum Administration
    Réponses: 4
    Dernier message: 11/02/2011, 16h23
  2. lister la structure d'une table
    Par Maitre B dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/09/2004, 10h43
  3. [SQL Access] Modifier la structure d'une table
    Par Le Lézard dans le forum Bases de données
    Réponses: 6
    Dernier message: 28/06/2004, 14h03
  4. Réponses: 7
    Dernier message: 18/06/2004, 09h58
  5. Lister la structure d'une table
    Par TMuet dans le forum SQL
    Réponses: 2
    Dernier message: 29/12/2003, 17h56

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