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 29/04/2008, 18h08   #1
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 64
Points : 25
Points : 25
Par défaut Transformation de données

Bonjour,

J'ai une table SAS qui a cette tête là :

A B D F 1
A B D G 2
A B E F 3
A B E G 4
A C D F 5
A C D G 6
A C E F 7
A C E G 8

Les 4 premières colonnes sont des identifiants, et la cinquième une valeur quelconque.
Ce que je voudrais faire, c'est de calculer à partir de cette table les différentes agrégations selon les 3 premières colonnes (et non les 4 premières)

Ainsi, je voudrais calculer la somme de la cinquième colonne en groupant sur la première colonne, et en gardant la quatrième, ce qui me donnerait :

A F 16
A G 20

de même, sur la troisième :

B F 4
B G 6
C F 12
C G 14

Je voudrais avoir le résultat sur une table unique, ce qui jusque là ne me pose pas problème, car je calcule les différentes agrégations et je concatène les tables de sortie en une seule. Mais je voudrais avoir une table de sortie exactement dans cet ordre :

A F 16
A G 20

B F 4
B G 6

D F 1
D G 2
E F 3
E G 4
C F 12
C G 14

D F 5
D G 6
E F 7
E F 8

Avec en rouge le plus haut niveau, puis en vert le deuxième niveau mais immédiatement après les valeurs du niveau inférieur.

Merci de votre aide
Fatah93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 18h48   #2
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Bonjour,
Avec du SQL tu peux utiliser les instructions group by et sum pour réaliser ce genre de manipulation.
Le group by te permettra de grouper selon tes colonnes voulu :
A F 16
A G 20
Pour ce cas tu aura group by col1, col4
Et ensuite tu somme(sum) sur ta cinquième variabel.

En SAS ça te donner quelque chose comme ça :
Code :
1
2
3
4
PROC SQL;
CREATE TABLE tableSortie AS
SELECT col1,col4,sum(col5) AS tot FROM tableInitiale GROUP BY col1,col5;
RUN;
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 19h42   #3
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 64
Points : 25
Points : 25
Oui mais cette partie ne me pose pas problème, ce qui me pose problème, c'est l'ordre des données dans la table de sortie qui doit être celui que j'ai précisé
Fatah93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 19h57   #4
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Bonjour,
Quelle est la logique de ta table de sortie?
Fafabzh
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2008, 21h55   #5
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 64
Points : 25
Points : 25
Bonjour,

Ma table de sortie me sert pour créer un tableau croisé et il faut que dans ce tableau les données de la colonne 1 apparaissent dans cet ordre précis.
Fatah93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2008, 10h54   #6
Membre confirmé
 
Inscription : avril 2008
Messages : 233
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2008
Messages : 233
Points : 216
Points : 216
Citation:
Envoyé par Fatah93 Voir le message
Bonjour,

Ma table de sortie me sert pour créer un tableau croisé et il faut que dans ce tableau les données de la colonne 1 apparaissent dans cet ordre précis.
Et bah c'est ça la question de fafabzh6 : quel est la logique de cet ordre précis ? D'abord le premier regroupement (1 et 4), ensuite le deuxième (2 et 4), etc ? Par l'ordre des données résultat ? Autre chose ?
green_fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2008, 11h24   #7
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 64
Points : 25
Points : 25
Bonjour,

Le but de ma table de sortie est d'avoir la hiérarchie initiale éclatée sur une seule colonne. donc en début de table on aurait le regroupement sur le plus haut niveau, ensuite, on aurait le regroupement sur le premier niveau inférieur, et pour ce niveau inférieur, on aurait tout de suite après les valeurs du niveau inférieur, etc.. Ce serait en quelque sorte une arborescence.
Ma table de sortie est peut-être plus clair présenté ainsi :

- A F 16
- A G 20

---- B F 4
---- B G 6

-------- D F 1
-------- D G 2
-------- E F 3
-------- E G 4
---- C F 12
---- C G 14

-------- D F 5
-------- D G 6
-------- E F 7
-------- E F 8

Si le plus haut niveau vaut 1, ensuite on a deux sous niveaux : 2 et 3, pour le sous niveau 2 on a les sous-niveaux 4 et 5, et pour le sous niveau 3 les sous-niveaux 6 et 7. L'ordre que je voudrais est : 1 2 4 5 3 6 7

J'espère avoir été clair.
Fatah93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2008, 14h31   #8
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 64
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 64
Points : 25
Points : 25
Finalement l'une des solutions était :

Code :
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
proc sql;
CREATE TABLE union AS
SELECT col1, '' AS col2, '' AS col3, col4, sum(col5) AS col5 FROM A GROUP BY col1, col4
union
SELECT col1, col2, '' AS col3, col4, sum(col5) AS col5 FROM A GROUP BY col1, col2, col4
union
SELECT col1, col2, col3, col4, sum(col5) AS col5 FROM A GROUP BY col1, col2, col3, col4;
quit;
 
DATA union2;
SET union;
IF col2 = '' then do;
	hier = col1;
end;
else IF col3 = '' then do;
	hier = col2;
end;
else do;
	hier = col3;
end;
run;
 
DATA sortie (keep = hier col4 col5);
SET union2;
run;
Fatah93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h50.


 
 
 
 
Partenaires

Hébergement Web