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 05/01/2012, 15h09   #1
Membre du Club
 
Inscription : mai 2005
Messages : 209
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 209
Points : 64
Points : 64
Envoyer un message via MSN à tiyolx
Par défaut Ajouter une condition à la fonction count()

Bonjour à tous,

Pouvez-vous me conseiller une solution pour créer une table en SQL.

J'ai un jeu de données comme ci-dessous :

id;dSortie;nevements;dEvenements
1;28/02/2012;1;10/01/2012
1;28/02/2012;2;20/01/2012
1;28/02/2012;3;30/01/2012
1;28/02/2012;4;10/02/2012
1;28/02/2012;5;20/02/2012

2;15/01/2012;1;10/01/2012
2;15/01/2012;2;20/01/2012

3;31/04/2012;1;10/04/2012
3;31/04/2012;2;20/04/2012
3;31/04/2012;3;30/04/2012
3;31/04/2012;4;10/05/2012

4;31/07/2012;1;10/07/2012
4;31/07/2012;2;20/07/2012

5;31/01/2012;1;10/02/2012
5;31/01/2012;2;20/02/2012
5;31/01/2012;3;10/03/2012
5;31/01/2012;4;20/03/2012

si j'exécute le code suivant :
Code :
1
2
3
4
5
6
7
 
proc sql;
	CREATE TABLE new_table AS 
	SELECT DISTINCT id, dSortie, count(id) AS evenements, 
	FROM ma_table 
	GROUP BY id; 
quit;
voici le résultat ci-dessous :

id;dSortie;evements
1;28/02/2012;5
2;15/01/2012;2
3;31/04/2012;4
4;31/07/2012;2
5;31/01/2012;4

Maintenant, je veux le nombre d’évènements avant la date de sortie.
Donc mon premier code est faux.
Comment ajouter une condition à la fonction "count()" pour obtenir le résultat ci-dessous :

id;dSortie;evements
1;28/02/2012;5
2;15/01/2012;1
3;31/04/2012;3
4;31/07/2012;2
5;31/01/2012;0

Merci de votre attention.
tiyolx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 15h17   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
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 : 957
Points : 1 368
Points : 1 368
Bonjour,
Je n'ai pas compris, ça veut dire quoi :"je veux le nombre d’évènements avant la date de sortie"?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 15h46   #3
Membre du Club
 
Inscription : mai 2005
Messages : 209
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 209
Points : 64
Points : 64
Envoyer un message via MSN à tiyolx
date de sortie = dSortie
évènements = nombre de ligne d'enregistrement

en fait il y a des dates d'évènements (dEvenements) avant la date de sortie et après.

seul les évènements avant m'intéresse

le premier résultat correspond au code.

le second résultat correspond au code que je cherche.
tiyolx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 15h49   #4
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
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 012
Points : 1 717
Points : 1 717
Hello;
j'ai modifié légérement tes données (AVRIL a 30 Jours)

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
26
27
28
29
30
31
32
33
34
35
36
37
38
 
 
 
 
DATA ma_table;
format dsortie dEvenements DDMMYY10.; 
INFILE  cards dlm=";";
input id dSortie DDMMYY10. id1 dEvenements  ddmmyy10.;
cards4;
1;28/02/2012;1;10/01/2012
1;28/02/2012;2;20/01/2012
1;28/02/2012;3;30/01/2012
1;28/02/2012;4;10/02/2012
1;28/02/2012;5;20/02/2012
2;15/01/2012;1;10/01/2012
2;15/01/2012;2;20/01/2012
3;30/04/2012;1;10/04/2012
3;30/04/2012;2;20/04/2012
3;30/04/2012;3;29/04/2012
3;30/04/2012;4;10/05/2012
4;31/07/2012;1;10/07/2012
4;31/07/2012;2;20/07/2012
5;31/01/2012;1;10/02/2012
5;31/01/2012;2;20/02/2012
5;31/01/2012;3;10/03/2012
5;31/01/2012;4;20/03/2012
;;;;
 
run;
 
 
 
proc sql;
	CREATE TABLE new_table AS 
	SELECT  id, dsortie, count (ID)  AS evenements 
	FROM ma_table WHERE Dsortie>dEvenements 
	GROUP BY id,dsortie ; 
quit;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 15h57   #5
Membre du Club
 
Inscription : mai 2005
Messages : 209
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 209
Points : 64
Points : 64
Envoyer un message via MSN à tiyolx
merci pour le mois avril. lol

mais ton groupe by ne supprime pas les dates d'évènements après la date de sortie (dSortie)
tiyolx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 16h03   #6
Membre du Club
 
Inscription : mai 2005
Messages : 209
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 209
Points : 64
Points : 64
Envoyer un message via MSN à tiyolx
la fonction where supprime l'id 5 alors que j'en ai besoin

id;dsortie;evenements
1;28/02/2012;5
2;15/01/2012;1
3;30/04/2012;3
4;31/07/2012;2

j'aurais plutôt imaginé un code comme ci-dessous

Code :
1
2
3
4
5
6
7
 
proc sql;
	CREATE TABLE &rep..new_table AS 
	SELECT  id, dsortie, count (ID, IF(dEvenement<dSortie))  AS evenements 
	FROM &rep..ma_table  
	GROUP BY id; 
quit;
tiyolx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 16h31   #7
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
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 012
Points : 1 717
Points : 1 717
Je vois;
Le code devient alors :

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
26
27
28
29
30
31
32
33
34
35
36
 
DATA ma_table;
format dsortie dEvenements DDMMYY10.; 
INFILE  cards dlm=";";
input id dSortie DDMMYY10. id1 dEvenements  ddmmyy10.;
cards4;
1;28/02/2012;1;10/01/2012
1;28/02/2012;2;20/01/2012
1;28/02/2012;3;30/01/2012
1;28/02/2012;4;10/02/2012
1;28/02/2012;5;20/02/2012
2;15/01/2012;1;10/01/2012
2;15/01/2012;2;20/01/2012
3;30/04/2012;1;10/04/2012
3;30/04/2012;2;20/04/2012
3;30/04/2012;3;29/04/2012
3;30/04/2012;4;10/05/2012
4;31/07/2012;1;10/07/2012
4;31/07/2012;2;20/07/2012
5;31/01/2012;1;10/02/2012
5;31/01/2012;2;20/02/2012
5;31/01/2012;3;10/03/2012
5;31/01/2012;4;20/03/2012
;;;;
 
run;
 
proc sql;
CREATE TABLE new_table AS SELECT DISTINCT id, dsortie,evenements
FROM ( SELECT DISTINCT id, dsortie,
case when Dsortie>dEvenements then 1
                               else 0
      end  AS nb  , sum (calculated nb)AS evenements  FROM ma_table
    	GROUP BY id,dsortie)
     ; 
quit;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 16h44   #8
Membre du Club
 
Inscription : mai 2005
Messages : 209
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 209
Points : 64
Points : 64
Envoyer un message via MSN à tiyolx
Merci de votre aide, le code s’exécute et le résultat est conforme.

Je voudrais pas abuser mais pouvez vous m'expliquer votre construction.
Car j'ai du mal a comprendre la logique.

Connaissez-vous de bonnes sources pour apprendre les syntaxe SQl sous SAS ?

Merci encore.
tiyolx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 16h54   #9
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
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 012
Points : 1 717
Points : 1 717
une requête imbriquée;
le select case m'a servi de FLAG ( numerique )
1 si Dsortie>dEvenements
0 si Dsortie<dEvenements

j'ai fais la somme des 1, et 0 par group ( id,dsortie) de la variable CALCULéE ( calculated) et j'ai groupé par id,dsortie.

Une petite correction :
Code :
1
2
3
4
5
6
7
8
9
10
11

proc sql;
CREATE TABLE new_table AS SELECT DISTINCT id, dsortie,evenements
FROM ( SELECT DISTINCT id, dsortie,
case when Dsortie>dEvenements then 1
                               else 0
      end  AS nb  , sum (calculated nb)AS evenements  FROM ma_table
    	GROUP BY id,dsortie)
     ; 
quit;
le deuxième distinct ne sert à rien puisque j'ai fais un group by,
désolé j'ai copier vite.

tu peux déssocier la requète en 2:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
proc sql;
CREATE TABLE new_table_temp AS SELECT  id, dsortie,
case when Dsortie>dEvenements then 1
                               else 0
      end  AS nb  , sum (calculated nb)AS evenements  FROM ma_table
    	GROUP BY id,dsortie
     ; 
quit;
 
 
proc sql;
CREATE TABLE new_table AS SELECT DISTINCT id, dsortie,evenements
FROM  new_table_temp;
quit;
Bon courage.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 17h00   #10
Membre du Club
 
Inscription : mai 2005
Messages : 209
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 209
Points : 64
Points : 64
Envoyer un message via MSN à tiyolx
Ne le prenez pas mal mais j'ai modifié le code pour obtenir vraiment mon besoin. Je souhaite le partager avec vous (parce que vous m'avez vraiment aidé) et avec les membres du forum.

Voici le code :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
proc sql;
	CREATE TABLE &rep..new_table AS SELECT id, count(id) AS evenements, evenements_reels
	FROM (
		SELECT id, 
		case when dSortie > dEvenements then 1 else 0 end AS nb, 
		sum (calculated nb)AS evenements_reels FROM &rep..ma_table
		GROUP BY id
	)
	GROUP BY id; 
quit;
tiyolx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 17h06   #11
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
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 012
Points : 1 717
Points : 1 717
Citation:
Envoyé par tiyolx Voir le message
Ne le prenez pas mal mais j'ai modifié le code pour obtenir vraiment mon besoin. Je souhaite le partager avec vous (parce que vous m'avez vraiment aidé) et avec les membres du forum.

Voici le code :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
proc sql;
	CREATE TABLE &rep..new_table AS SELECT id, count(id) AS evenements, evenements_reels
	FROM (
		SELECT id, 
		case when dSortie > dEvenements then 1 else 0 end AS nb, 
		sum (calculated nb)AS evenements_reels FROM &rep..ma_table
		GROUP BY id
	)
	GROUP BY id; 
quit;
NON je ne le prends pas mal, ce que je t'ai proposé , répond à ce que t'as souhaité obtenir au début :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
Maintenant, je veux le nombre d’évènements avant la date de sortie.
Donc mon premier code est faux.
Comment ajouter une condition à la fonction "count()" pour obtenir le résultat ci-dessous :
 
id;dSortie;evements
1;28/02/2012;5
2;15/01/2012;1
3;31/04/2012;3
4;31/07/2012;2
5;31/01/2012;0
 
Merci de votre attention.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 17h14   #12
Membre du Club
 
Inscription : mai 2005
Messages : 209
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 209
Points : 64
Points : 64
Envoyer un message via MSN à tiyolx
Oui vous avez entièrement raison votre code répond à ma demande.

Avez-vous un peu de temps pour m'explique votre approche avec la requete au niveau du FROM car je comprends pas pourquoi on doit le faire de cette manière.

Merci de votre aide.
tiyolx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 18h23   #13
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 828
Points : 2 828
Et pourquoi pas
Code :
1
2
3
4
5
6
proc sql;
	CREATE TABLE &rep..new_table AS 
	SELECT  id, dsortie, SUM(dEvenement<dSortie)  AS evenements 
	FROM &rep..ma_table  
	GROUP BY id; 
quit;
La condition est évaluée par SAS à 1 si elle est vraie, à 0 sinon. Ca conserve l'idée que tu avais à l'origine, il faut juste sommer des 1 et des 0 plutôt que de compter les lignes, ce qui au final revient au même.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 18h27   #14
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
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 012
Points : 1 717
Points : 1 717
avec sa peut être :
Code :
1
2
3
4
5
6
7
8
9
10
 
 
 
 
proc sql;
	CREATE TABLE new_tableO AS 
	SELECT  id, dsortie, SUM(dEvenements<dSortie)  AS evenements, count( dEvenements) AS nb_dEvenements
	FROM ma_table  
	GROUP BY id, dsortie; 
quit;
Olivier, il te manque un group by DSORTIE
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 15h21   #15
Membre du Club
 
Inscription : mai 2005
Messages : 209
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 209
Points : 64
Points : 64
Envoyer un message via MSN à tiyolx
Merci olivier et sam de votre aide, je rebondis un peu tard, mais c'est pas grave.

voici les codes que j'ai réussi à faire compiler :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
proc sql;
	CREATE TABLE &rep..new_table AS SELECT id, count(id) AS evenements, evenements_reels
	FROM (
		SELECT id, 
		case when dSortie > dEvenements then 1 else 0 end AS nb, 
		sum (calculated nb)AS evenements_reels FROM &rep..ma_table
		GROUP BY id
	)
	GROUP BY id; 
quit;
 
proc sql;
	CREATE TABLE &rep..new_table AS 
	SELECT  id, dsortie, count(id) AS evenements, SUM(dEvenements<dSortie) AS dEvenements_reels
	FROM &rep..ma_table  
	GROUP BY id, dSortie; 
quit;
A bientôt pour de nouvelle aventure, MDR
tiyolx 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 21h08.


 
 
 
 
Partenaires

Hébergement Web