Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
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 06/07/2011, 14h38   #1
Invité de passage
 
Inscription : mars 2009
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 10
Points : 3
Points : 3
Par défaut Comparaison entre lignes

Bonjour,


Je souhaite comparer les lignes de ma table. Je débute... j'ai cru comprendre qu'il fallait utiliser des macro-variables (ou du sql ?) mais je n'y entends rien . Pouvez-vous m'aider ?

Exemple sur ce programme test : (plusieurs lignes par identifiant)

Les lignes peuvent être identiques par identifiant mais diffère quelques fois seulement pour la variable xx.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA test;
input id $ a $ xx $ c $;
cards;
1 2 4 5
1 2 4 5
2 2 4 5
2 2 5 5
3 3 4 5
3 3 4 5
4 4 4 4
4 4 4 1
;
 
run;
Je souhaite obtenir la ligne de l'identifiant 2 car xx est égal a 4 ou a 5.

Merci d'avance..
popoline est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 15h10   #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
no enough clear, sorry
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 15h17   #3
Invité de passage
 
Inscription : mars 2009
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 10
Points : 3
Points : 3
Je souhaite comparer les lignes entre elles. Je ne souhaiterais garder que les lignes ou les id sont identiques ainsi que les a et c mais avec un xx different.
popoline est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 15h24   #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
Qu'entends-tu par id et xx identiques? je vois qu'un seul id et un seul xx par ligne. Je ne sais si j'ai été clair
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 15h27   #5
Invité de passage
 
Inscription : mars 2009
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 10
Points : 3
Points : 3
Je veux comparer l'id de la ligne 1 avec l'id de la ligne 2, le a de la ligne 1 avec le a de la ligne 2, etc
popoline est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 17h08   #6
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
comparer ? mais comment , tu veux supprimer les doublons ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 17h29   #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
est ce que ca te donne ce que tu souhaites?

Code :
1
2
3
4
5
6
7
8
proc sql;
CREATE TABLE detection AS
SELECT *
FROM test
GROUP BY id
HAVING count(DISTINCT xx)>1
;
quit;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 12h31   #8
Invité régulier
 
Inscription : août 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 11
Points : 6
Points : 6
Envoyer un message via MSN à Amaranthe
Si j'ai bien compris la demande...

Code :
1
2
3
4
5
6
7
8
 
SELECT un.id, un.a, un.c, un.xx, deux.xx 
FROM test un, test deux
WHERE 1 = 1 
 AND un.id = deux.id
 AND un.a = deux.a
 AND un.c = deux.c
 AND un.xx = deux.xx
Je bosse sur la même chose en ce moment, et j'aimerai bien pouvoir automatiser cette requête, sachant que je vousdrais faire cela pour toutes les TABLE_NAME d'une table, dans laquelle j'aurai un champ TABLE_NAME contenant le nom des tables a vérifier et un champ TABLE_KEYS contenant les champs clef de cette table...
Amaranthe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 12h53   #9
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
Bonjour Amaranthe,

meme si similaire, ta requete a surement des differences vis-a-vis de celle au dessus. Peux tu donc ouvirer un nouveau sujet propre a ta requete afin que les pinceaux ne se melangent pas?

Je ne suis pas sur de bien comprendre ce que tu veux faire, et pourquoi tu le codes comme cela. Pourras tu reexpliquer le probleme en meme temps?
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 13h27   #10
Invité de passage
 
Inscription : mars 2009
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 10
Points : 3
Points : 3
Tout d'abord merci à tous pour votre aide.

S_a_m je veux un listing de toutes les lignes qui ont les memes valeurs pour toutes les variables par identifiant MAIS avec une valeur differente sur une de ces variables (variable xx, toujours la meme).

Amaranthe, je ne crois pas qu'il s'agisse de la meme chose...

Et enfin Manoutz, ton programme marche presque mais je me retrouve avec des lignes ou xx est bien different mais certaines autres variables aussi. Je ne veux que des lignes avec xx differents par identifiant et a et c égaux.

Exemple en changeant la derniere ligne de ma table :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
DATA test;
input id $ a $ xx $ c $;
cards;
1 2 4 5
1 2 4 5
2 2 4 5
2 2 5 5
3 3 4 5
3 3 4 5
4 4 4 4
4 4 1 1
;
run;
Mon résultat est donc une table avec les lignes de l'id 2 et 4 alors que je ne souhaitais que la 2 car l'id 4 differe bien sur xx mais aussi sur c.

J'espere etre a peu près compréhensible...
popoline est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 13h33   #11
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
Alors je propose quelque chose comme ça, avec des marqueurs de blocs.
Il y a peut-être plus simple.
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
DATA test;
input id $ a $ xx $ c $;
cards;
1 2 4 5
1 2 4 5
2 2 4 5
2 2 5 5
3 3 4 5
3 3 4 5
4 4 4 4
4 4 1 1
;
run;
PROC SORT DATA=test OUT=test2 ;
  BY id a c xx ;
RUN ;
DATA res ;
  SET test2 ;
  BY id a c xx ;
  IF FIRST.xx AND LAST.xx 
 AND NOT(FIRST.c AND LAST.c) THEN OUTPUT ;
RUN ;
PROC PRINT ;
RUN ;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 13h37   #12
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
le principe est le meme (si j'ai bien compris ce que tu souhaites obtenir)

Code :
1
2
3
4
5
6
7
8
proc sql;
CREATE TABLE detection AS
SELECT *
FROM test
GROUP BY id
HAVING count(DISTINCT xx)>1 AND count (DISTINCT a)=1 AND count (DISTINCT c)=1
;
quit;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 13h37   #13
Invité régulier
 
Inscription : août 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 11
Points : 6
Points : 6
Envoyer un message via MSN à Amaranthe
Je persiste popoline, ma requête devrait parfaitement convenir a ton besoin.

Prends juste la peine de l'éxécuter.

Pour être plus précis ma requête ramene les lignes pour lesquelles id, a et c sont identiques mais xx est différent.
Et affiche pour chaque cas, les valeurs de id, a et c, puis les deux valeurs de xx.

Sqlment vôtre,
Amaranthe 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 03h31.


 
 
 
 
Partenaires

Hébergement Web