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

SAS Base Discussion :

Fusion verticale de deux tables avec aggrégation selon clé multiple


Sujet :

SAS Base

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut Fusion verticale de deux tables avec aggrégation selon clé multiple
    Bonjour,

    Voici la problématique que je rencontre actuellement et pour laquelle je sollicite votre aide.

    Je dispose de deux tables identiques de N colonnes :

    8 colonnes servant de clé unique
    2 colonnes montant1 et montant 2
    240 autres colonnes contenant diverses informations

    Je souhaite fusionner ces deux tables et agréger les lignes uniques : SOMME(montant1) et SOMME(montant2). L'unicité étant portée par les 8 clés

    En temps normal, avec une table plus simple (une clé et une variable agrégée), j'aurai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DATA fusion;
    SET table1 table2;
    RUN;
    puis une proc sql:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id, SUM(montant1) FROM fusion GROUP BY id;
    Mais avec mes tables de 250 colonnes, je trouve cela fastidieux : dans le SELECT de ma proc SQL, je suis obligé de déclarer 250 variables.
    J'ai essayé de realiser cela en MERGE mais je n'y arrive pas.

    Est-ce que quelqu'un a une solution plus simple et jolie, et aussi la moins couteuse en temps de traitement?

    Merci beaucoup

  2. #2
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Bonjour
    Je n'ai pas compris quand vous dites 250 variables dans proc SQL
    L'agrégation porte seulement sur montant 1 et montant 2 non ?
    La commande d'étape data marche pour n'importe quelle table. Donc même pour votre table le premier code marche très bien.
    Dans votre second code vous n'avez pas déclaré les autres variables, ce serait les 8 variables d'identification et non 250. Enfin, sauf si j'ai mal compris le problème.
    • Faites un tour sur mon siteweb professionnel www.aristideelysee.16mb.com Des codes dans la section "media et code" pouvant vous aider que vous pouvez aussi partager sur les réseaux sociaux.
    • Visiter mon blog en cliquant ici! Des techniques, astuces et macros pour l'analyse quantitative.

  3. #3
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Voici un exemple de ce que je crois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc sql; select ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, sum(Montant1), sum(Montant2) from Fusion group by ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8;
    • Faites un tour sur mon siteweb professionnel www.aristideelysee.16mb.com Des codes dans la section "media et code" pouvant vous aider que vous pouvez aussi partager sur les réseaux sociaux.
    • Visiter mon blog en cliquant ici! Des techniques, astuces et macros pour l'analyse quantitative.

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Oui c'est bien ça, à la différence près suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc sql; select ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, VAR1, ... , VAR250 sum(Montant1), sum(Montant2) from Fusion group by ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8;
    Je ne veux pas perdre mes 250 variables. Du coup je suis obligé de toutes les déclarer dans mon select ?
    ou alors, exécuter la requête que vous avez indiqué, puis refaire une jointure sur les clés pour récupérer les 250 variables.

    Je me fais peut-être des nœuds au cerveau.. mais je ne sais pas vraiment quelle est la solution la plus idéale et performante.

  5. #5
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Je pense que ce n'est pas trop clair

    Vous voulez calculer les totaux par ID, ce qui veut dire déjà que le même ID se répète plusieurs fois dans la table. Sinon je ne vois par pourquoi il faut calculer total de montant 1 par ID. Sinon si les 8 ID sont unique c'est comme si vous répliquer exactement la table de départ. parce que SAS va calculer la somme d'une ligne. Sauf si les 8 ID peuvent se répéter, ce qui est peu probable parce que c'est des identifiants.

    Mais imaginons même que les ID se répetent. Si vous voulez conserver les autres variables, la question est de savoir laquelle des ligne conserver ? Par exemple supposons ceci

    ID1 ID2 ID3 Montant1 VAR1 VAR2
    1 1 1 40 14 31
    1 1 1 58 13 0
    1 1 1 12 64 61
    1 1 2 18 44 0
    1 1 2 22 40 11

    Si la table n'a pas une structure pareille, on ne peut pas calculer la somme par ID1 ID2 ID3. Ici les ID se répètent. Donc si je veux conserver VAR1 et VAR2, la question est de savoir lequel des VAR1 et VAR2 garder car il y a 3 pour l'individu 1 et 2 pour l'individu 2.
    Je ne comprends pas encore bien. Si vous voulez garder toutes les VAR en ayant toujours les ID dupliqués mais en replaçant Montant par somme de montant c'est plus facile. Mais je ne sais pas si c'est ce que vous voulez faire.
    • Faites un tour sur mon siteweb professionnel www.aristideelysee.16mb.com Des codes dans la section "media et code" pouvant vous aider que vous pouvez aussi partager sur les réseaux sociaux.
    • Visiter mon blog en cliquant ici! Des techniques, astuces et macros pour l'analyse quantitative.

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 46
    Points
    46
    Par défaut
    Bonsoir,

    Désolé pour cette réponse tardive, j'ai eu quelques contraintes.

    Je vais essayer de concrétiser mon exemple, ça sera plus clair pour moi et j'espère pour vous.

    Mes observations correspondent à des groupes d'individus.
    Mes individus sont regroupés selon différents critères, notamment l'âge et le sexe.

    Pour chaque groupe, j'ai un nombre d'individus et un montant correspondant au montant total investit par les individus.

    Groupe1 / 50 ans / Homme / NB_INDIVIDUS=200 / MNT=10000€ / + 250 autres variables caractérisant le groupe1
    Groupe2 / 60 ans / Femme / NB_INDIVIDUS=100 / MNT=5000€ / + 250 autres variables caractérisant le groupe2
    ...
    J'ai une boucle qui me permet de simuler l'évolution de ce stock tous les ans, avec notamment l'arrivée de nouveaux individus

    Chaque année, j'ai donc une table de nouveaux individus :
    Groupe1 /50 ans / Homme / NB_NOUVEAU_INDIVIDUS=10 / MNT_A_AJOUTER = 1000 € / + 250 autres variables caractérisant le groupe1
    Groupe2 /60 ans / Femme / NB_NOUVEAU_INDIVIDUS=6 / MNT_A_AJOUTER = 400 € / + 250 autres variables caractérisant le groupe2
    les 250 variables sont toujours identiques pour un groupe donnée, contrairement à ce que pourrait laisser penser mes premiers messages.

    Je souhaite donc ajouter NB_NOUVEAU_INDIVIDUS à NB_INDIVIDUS et MNT_A_AJOUTER à MNT, sans perdre toutes mes variables, car celles-ci me servent :
    - pour les calculs du nombre de nouveaux individus, et des montants à ajouter.
    - à actualiser le stock (car celui-ci varie par ailleurs en fonction de décès,...)

    d'où dans un 1er temps la fusion des 2 tables puis la requête d'agrégation suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc sql; select ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, VAR1, ... , VAR250 sum(Montant1), sum(Montant2) from Fusion group by ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8;
    Autant dire que la requête est longue et je ne sais absolument pas si c'est optimisé.

    J'ai cherché du côté de la commande Update pour mettre à jour uniquement NB et MNT mais je n'y arrive pas.

    Dans un langage de développement type objet, j'aurai juste eu à sommer les 2 données : le code est simpliste et peu couteux en temps de calcul. Je ne suis pas obligé de re-déclarer toutes mes variables.

  7. #7
    Membre régulier
    Homme Profil pro
    Consultant SI
    Inscrit en
    Février 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Consultant SI
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 63
    Points : 92
    Points
    92
    Par défaut
    Je prend la suite même si le sujet est ancien.

    Si on prend un peu de recul, on se dit alors qu'il n'est pas intéressant d'avoir les VAR1, ... , VAR250 dans la même table que les Montants non groupés.

    J'aurai fait 2 tables :

    Une première (TABLE1) avec ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8 et les montants.
    Celle ci j'aurai pu ensuite l'utiliser comme cela :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    proc sql; select ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, sum(Montant1), sum(Montant2) from Fusion group by ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8;
    pour créer une TABLE1BIS , groupement de TABLE1.

    La deuxième (TABLE2) serait ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8 , VAR1, ... , VAR250
    NOTE : TABLE2 correspond à
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    proc sql; select distinct ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, VAR1, ... , VAR250 from Fusion;

    Et au final, je peux ensuite créer une TABLE3 ( ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, VAR1, ... , VAR250, MONTANT1_SOMME, MONTANT2_SOMME ) en joignant TABLE1BIS et TABLE2 , par les ID.


    EDIT : J'ajoute que la piste des update est désastreuse en terme de performance. Il peut arriver qu'on s'en serve dans certains besoins complexes, mais ce n'est pas utile ici.

Discussions similaires

  1. Fusion verticale de deux images avec WIA
    Par blondelle dans le forum C++Builder
    Réponses: 0
    Dernier message: 22/05/2009, 15h25
  2. Croisement de deux tables avec SUM et sans doublon
    Par ar|equin dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/06/2007, 17h52
  3. deux tables avec meme nom attribut
    Par jolatouf dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 11/05/2006, 14h21
  4. Réponses: 7
    Dernier message: 14/02/2006, 10h33

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