Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/04/2011, 09h53   #1
Invité de passage
 
Inscription : décembre 2009
Messages : 117
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 117
Points : 4
Points : 4
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
debutsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h11   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
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
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h14   #3
Invité de passage
 
Inscription : décembre 2009
Messages : 117
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 117
Points : 4
Points : 4
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?
debutsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h17   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
ta variable commune et numérique ou caractère? c'est mieux dans une même table
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h18   #5
Invité de passage
 
Inscription : décembre 2009
Messages : 117
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 117
Points : 4
Points : 4
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.
debutsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h37   #6
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
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 :
1
2
3
4
DATA test;
SET test;
commune2=substr(compress(put(commune,best.)),1,2) ;
RUN;
Code :
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!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h42   #7
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
autre possibilité qui réduit la taille de la table: créer un format sur commune2. Ca évite d'avoir à créer commune_reg
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h46   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
J'ai mis en commentaire, mais tu peux compléter Manoutz !!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h47   #9
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
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.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h51   #10
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
J'ai rien pigé Olivier
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h51   #11
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
@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)
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h00   #12
Invité de passage
 
Inscription : décembre 2009
Messages : 117
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 117
Points : 4
Points : 4
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)
debutsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h12   #13
Invité de passage
 
Inscription : décembre 2009
Messages : 117
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 117
Points : 4
Points : 4
Code :
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)
debutsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h13   #14
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
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.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h14   #15
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Code :
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;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h18   #16
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
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 :
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 :
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
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h19   #17
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
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.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h22   #18
Invité de passage
 
Inscription : décembre 2009
Messages : 117
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 117
Points : 4
Points : 4
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!!)
debutsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h27   #19
Invité de passage
 
Inscription : décembre 2009
Messages : 117
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 117
Points : 4
Points : 4
ma table d'être transposée (table2)
et uen fois aprés(table1)
debutsas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h31   #20
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
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.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h11.


 
 
 
 
Partenaires

Hébergement Web