Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Débutez
Débutez Forum concentrant les premières questions que l'on se pose en tant que débutant
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 15/03/2011, 13h51   #1
Invité de passage
 
Inscription : mars 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Par défaut Multiplication du nombre de lignes

Bonjour,
Petite question d'un débutant...
J'ai une table T1 dans laquelle j'ai 3 colonnes avec, mettons les données suivantes :
START_DATE | END_DATE | NB_WEEKS | WORKLOAD_PER_WEEK
14/03/2011 | 16/03/2011 | 1 | 1
14/03/2011 | 30/03/2011 | 3 | 4

Ceci corresponds à une list de tâches à réaliser avec la date de début de semaine de la tâche, la date de fin, le nombre de semaine entre ces deux dates, le nombre de jours à faire pour réaliser cette tâche.

Je souhaiterais transformer cette table de sorte que
1. chaque ligne soit dupliquées autant de fois qu'il y a de NB_WEEKS
2. si une ligne est dupliquée la start_date sera incrémentée de +7 jours à chaque duplication.

Pour notre exemple,
- la première ligne serait donc copiée telle quel, car NB_WEEK = 1
- la seconde ligne serait donc dupliquée 2 FOIS (car NB_WEEK = 3). La première duplication entraine START_DATE = START_DATE + 7 et la seconde duplication entraine START_DATE = START_DATE + (7x2)

La table cible serait donc la suivante :
START_DATE | END_DATE | WORKLOAD_PER_WEEK
14/03/2011 | 16/03/2011 | 1
14/03/2011 | 30/03/2011 | 4
21/03/2011 | 30/03/2011 | 4
28/03/2011 | 30/03/2011 | 4


C'est probablement un cas d'école pour les experts mais pour les débutants, y'a de quoi s'arracher les cheveux... (s'il nous en reste !)

Merci pour votre aide!!
ycolpin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 14h06   #2
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
Bonjour.
Une étape Data ferait ça très bien, à condition d'y inclure une boucle au sein de laquelle une instruction OUTPUT force l'écriture d'une nouvelle observation.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DATA work.a_faire ;
  INFILE DATALINES DLM="|" MISSOVER DSD ;
  INPUT START_DATE :ddmmyy10.
        END_DATE   :ddmmyy10.
        NB_WEEKS 
        WORKLOAD_PER_WEEK ;
  FORMAT start_date end_date DDMMYY10. ;
DATALINES ;
14/03/2011 | 16/03/2011 | 1 | 1
14/03/2011 | 30/03/2011 | 3 | 4
;
RUN ;
DATA work.par_semaine ;
  SET work.a_faire ;
  end = start_date ;
  FORMAT end DDMMYY10. ;
  DO i=1 TO nb_weeks ;
    end = MIN(end+7, end_date) ;
	OUTPUT ;
  END ;
RUN ;
A ta disposition si tu souhaites des précisions.
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/03/2011, 14h15   #3
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Bonjour,
Voici une solution:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DATA test;
informat START_DATE   END_DATE ddmmyy10.;
format START_DATE   END_DATE ddmmyy10.;
INFILE cards dlm="|";
input START_DATE   END_DATE   NB_WEEKS   WORKLOAD_PER_WEEK;
cards;
14/03/2011 | 16/03/2011 | 1 | 1
14/03/2011 | 30/03/2011 | 3 | 4
;
run;
 
DATA test2;
SET test;
output;
IF NB_WEEKS > 1 then do i=2 TO  NB_WEEKS;
	START_DATE = START_DATE + 7;
output;
end;
keep START_DATE END_DATE WORKLOAD_PER_WEEK;
run;
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/03/2011, 15h00   #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
Code :
1
2
3
4
5
6
7
8
9
data test2;
set test;
output;
if NB_WEEKS > 1 then do i=2 to  NB_WEEKS;
	START_DATE = START_DATE + 7;
output;
end;
keep START_DATE END_DATE WORKLOAD_PER_WEEK;
run;
Le premier Output sert à quoi Sasadm? juste pour comprendre!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h23   #5
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Bonjour Brice,

L'output est la commande qui provoque l'écriture du vecteur de travail (<=> ecriture d'une observation dans la table de sortie). Par défaut, l'output est implicite. Si on devait le placer dans une étape data classique, il faudrait le mettre juste avant le run:

Code :
1
2
3
4
5
 
DATA test;
SET test;
...
run;
équivaut à

Code :
1
2
3
4
5
6
 
DATA test;
SET test;
...
output;
run;
Donc j'emploie un output juste après le set pour dire à SAS d'écrire dans la table de sortie l'observation de la table d'entrée telle quelle (sans modification).
Ensuite si NB_WEEk est superieure ou égale à 2 il y a déclenchement d'une boucle do toujours à partir du même vecteur de travail, ce qui permet d'incrémenter date_start de 7 jours en 7 jours.
Pour que chaque iteration produise l'écriture d'une observation, je ré-emploie la commande output dans la boucle.

Si je ne suis pas clair, relance le code en enlevant/ajoutant/deplaçant des output. Tu verras quel est l'impact sur la sortie.
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h27   #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
Justement, j'ai testé et ça ne marche pas sans le premier output, c'est pour ça que je voulais comprendre le pourquoi. En tout cas tu as été assez clair.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h29   #7
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Petite précision:

Olivier fait nb_weeks iteration (i=1 to nb_weeks ). Sa premiere itération correspond à mon premier output.

Moi je fais un output d'entrée et s'il y a lieu, j'enchaine par nb_weeks-1 iterations puisque je commence par i=2.
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h38   #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
Yep!!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 11h29   #9
Invité de passage
 
Inscription : mars 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Par défaut Merci à vous

Franchement, merci! je ne m'attendais pas à des réponses aussi précises, rapides et efficaces!
A bientôt!
ycolpin 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 21h24.


 
 
 
 
Partenaires

Hébergement Web