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 :

requete sql pour sommer des colonnes


Sujet :

SAS Base

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut requete sql pour sommer des colonnes
    Bonjour à tous,

    alors mon pb aujourd'hui est le suivant:

    j'ai une table qui se présente comme vous pouvez le voir dans la PJ.

    mon but est de réussire à faire la somme des colonnes(que je veux) dans une autre colonne.
    par exemple toutes les communes commencant par un 03 en faire la somme dans une colonne " département de l'Allier", toutes les communes commencant par un 15 dans uen colonne" département du cantal" ....

    merci pour votre aide

  2. #2
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    Salut,
    Tu les veux dans une même table ? Tu veux extraire toutes les premières chaines de tes 473 communes et les sommer là dessus? Je commence à connaitre ton projet

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut
    oui oui je m'en doute, tu m'a aidé à chaqué étape( je pensais même à en faire un résumé et le poster içi, qui sait ça pourra aider d'autres personnes!!)

    pour répondre à ta question, les deux possibilités me vont!!
    même si je pense que vuet mieux avoir les résultats sur une autre table!!??? non??? qu'est ce que tu en pense?

  4. #4
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    ta variable commune et numérique ou caractère? c'est mieux dans une même table

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut
    moi je dois arriver à regrouper toutes les communes du cantal, allier, haute loire, etranger, ile de france, province,.......
    et donc j'ai pensé(logiquement aussi) au code département.
    03 --> allier
    15-->cantal
    43--> haute loire
    75,77,78,91,92,93,94,95 --> ile de france
    ...
    c'est pour cela que je voulais avant avoir une table croisé des communes avec le flux, pour pouvoir sommer directement.

    [Edit]
    commune: numérique.
    et bien va pour la même table.

  6. #6
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    Citation Envoyé par debutsas Voir le message
    commune: numérique.
    et bien va pour la même table.
    Tu commences d'abord pas extraire les deux premières chaines (la fonction substr), pour cela il fallait convertir en caratère (input).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DATA test;
    SET test;
    commune2=substr(compress(put(commune,best.)),1,2) ;
    RUN;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DATA TEST2;
    SET TEST;
     IF commune2="03" THEN commune_reg="allier"; /* ou une proc format*/
     IF commune2="15" THEN commune_reg="cantal";
     IF commune2="43" THEN commune_reg=" haute loire";
     IF commune2 in ("75" "77" "78" "91" "92" "93" "94" "95") THEN commune_reg=" ile de france";                  
    /* tu complètes s'il y a d'autres régions*/
    RUN;
    puis une étape supplémentaire en SQL qui est la somme de ce que tu veux group BY commune_reg.

    J'espere que j'ai été clair!

  7. #7
    Membre Expert
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Par défaut
    autre possibilité qui réduit la taille de la table: créer un format sur commune2. Ca évite d'avoir à créer commune_reg

  8. #8
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    J'ai mis en commentaire, mais tu peux compléter Manoutz !!

  9. #9
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Oui mais le format (dont je suis fan pourtant) ne sera pas pris en compte par la proc SQL pour agréger. Il faudrait créer commune_reg avec un PUT dans le SELECT et s'en resservir dans le GROUP BY.

  10. #10
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    J'ai rien pigé Olivier

  11. #11
    Membre Expert
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Par défaut
    @brice:C'est deux choses différentes. La je parle de FOMATTER les données, via une proc format. Dans ton code, tu créée une variable supplémentaire pour afficher le nom du département. plutot que de créer deux variables, une pour le numéro de département(ou groupement de département), une pour son nom, autant en créer qu'une seule et modifier son affichage.

    @ Olivier: mon idée est de créer commune2 à l'image des groupes que l'on va utiliser pour la synthèse. Ca peut se défendre dans le sens ou les données ne sont pas utilisées au niveau "département", mais plutot au niveau d'un niveau d'un groupe synthèse (qui peut être un département ou un ensemble de département)

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut
    oulàà doucement les gars, j'ai rien compris.
    j'en suis encore à la première solution de megamind2.
    tu me demande e convertir le format de ma commune qui va de 63000 à 63473.
    alors que moi je veux faire des sommes au niveau de mes comm_XXXX !!(ils sont en format num)

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut
    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
    data test;
    set test;
    commune2= substr(compress(input(comm_,best.)),1,2);
    run;
     
    data test2;
    set test;
    if commune2="03" then commune_reg="Allier";
    if commune2="15" then commune_reg="Cantal";
    if commune2="43" then commune_reg="Haute Loire";
    if commune2 in("75","77","78","91","92","93","94","95") then commune_reg="Ile de France";
    run;
     
    proc sql;
    create table RES as select Commune, commune_reg from test2
    group by commune_reg;
    quit;
    j'ai comme résultat, une table RES avec deux variables "Commune"(toutes sauf 03,15,43,..) et commuen_reg( rien dedans)

  14. #14
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    Citation Envoyé par Manoutz Voir le message
    @brice:C'est deux choses différentes. La je parle de FOMATTER les données, via une proc format. Dans ton code, tu créée une variable supplémentaire pour afficher le nom du département. plutot que de créer deux variables, une pour le numéro de département(ou groupement de département), une pour son nom, autant en créer qu'une seule et modifier son affichage.
    Je suis pas contre ta suggestion Manoutz, mais c'est juste que j'ai pris une mauvaise habitude de ne pas souvent penser à utiliser une proc format qui parrait pourant être plus optimale car on ne genère pas une nouvelle variable. C'est pour cela que j'ai mis en commentaire dans le code qu'on peut utiliser une proc format au lieu des IF.

  15. #15
    Membre Expert
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Par défaut
    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
    proc format;
    value GPDPT
    03="allier"
    15="cantal"
    43="haute loire"
    1001="ile de france"’
    ;
    run;
     
    DATA TEST2;
    SET TEST;
    format communedpt GPDPT.;
     IF substr(compress(put(commune,best.)),1,2) ="03" THEN communedpt =03; /* ou une proc format*/
     IF substr(compress(put(commune,best.)),1,2) ="15" THEN communedpt =15;
     IF substr(compress(put(commune,best.)),1,2) ="43" THEN communedpt =43;
     IF substr(compress(put(commune,best.)),1,2) IN ("75" "77" "78" "91" "92" "93" "94" "95") THEN communedpt =1001;          
    RUN;
     
    proc sql;
    CREATE TABLE RES AS SELECT Commune, commune_reg FROM test2
    GROUP BY communedpt ;
    quit;

  16. #16
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Par défaut
    Bon alors 2 nouvelles : la 1e c'est que vous pouvez ne pas tenir compte de mon message plus haut, je m'étais mépris sur les intentions de Manoutz. (Pour info Brice, ce que je voulais dire, c'est qu'au contraire d'une proc MEANS avec CLASS, il ne suffit pas d'avoir un format en SQL pour qu'il groupe selon les valeurs formatées.)
    La 2e, c'est que si je comprends bien ton besoin DebutSAS, ce sont toutes les colonnes dont le nom commence par... que tu veux sommer ensemble, une ligne à la fois (il sera temps de les agréger ensuite j'imagine).
    Je pense que l'étape DATA sera plus simple, surtout vu les noms de tes colonnes. Pas de chance d'ailleurs, tous les codes communes ne sont pas sur 5 chiffres avec un zéro à gauche. Ca nous aurait facilité la vie, car on peut alors écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    total_gard = SUM(OF commune_30:) ;
    total_allier = SUM(OF commune_03:) ;
    Là c'est un peu plus compliqué puisque si tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    total_allier = SUM(OF commune_3:) ;
    tu vas agréger les communes de l'Allier, mais aussi du Gard, de la Haute-Garonne, du Gers, etc. (tous les codes commençant par un 3 sans se préoccuper de leur longueur).

    Si c'est bien ça ton besoin, on peut imaginer deux solutions :
    1) tu peux modifier la table en remontant dans le programme qui la crée et mettre systématiquement les n°s de communes sur 5 chiffres (un format Z5. dans un PUT devrait être bien pour ça)
    2) sinon il va falloir bricoler avec un ARRAY, ce sera rigolo à écrire mais sans doute moins à comprendre.

    Dis-moi si je suis dans le vrai ou si je dois tout de suite aller me coucher.
    Olivier

  17. #17
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    Pour que ça marche, il faudrait que ta variables commune soit en ligne et ne soit pas précédée de comm_. A un moment donné, tu as transposé ta table, en fait il faut appliquer ce code juste avant. Si tu as une copie d'écran de ta table avant la transposition, postes la.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut
    ouiiiii tu es dans le vrai(ne va pas te coucher STP !!)
    oui je veux faire une somme sur mes colonnes qui comment par comm_XXXX par commune ( d'ou le pb que par exemple pour l'allier j'ai pas le 0 au début!!)

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 117
    Par défaut
    ma table d'être transposée (table2)
    et uen fois aprés(table1)

  20. #20
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    Citation Envoyé par debutsas Voir le message
    ma table d'être transposée (table2)
    et uen fois aprés(table1)
    Dans le code, tu dois remplacer commune par DCRAN, puis transposer si tu veux garder la même structure que la deuxième copie d'écran.

Discussions similaires

  1. Requete SQL pour trouver des anniversaires
    Par hugo69 dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/09/2010, 15h43
  2. Requête SQL pour fusionner des colonnes
    Par Aenur56 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 20/05/2010, 20h23
  3. Réponses: 2
    Dernier message: 15/02/2010, 02h07
  4. Requete SQL pour faire des ratios [ACCESS 2002]
    Par jacques64 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 22/12/2008, 17h18
  5. requete SQL pour nom de colonne de mes tables..
    Par dutty76 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/03/2008, 12h06

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