1 pièce(s) jointe(s)
Sommer ou soustraire des données à partir d'une date précise
Bonjour,
J'ai la table suivante :
Pièce jointe 456877
Je souhaite faire 2 choses :
- je souhaite, pour chaque jour et par fiche, faire un cumul de la colonne "feed_lisse7j", toujours à partir du 1er jour (23/11/2018).
Par exemple, pour le 26/11/2018, j'aurais la somme "feed_lisse7j" du 23/11/2018 + 24/11/2018 + 25/11/2018 + 26/11/2018 : soit 6756 au total.
et ainsi de suite pour chaque jour.
pour cela, j'ai mis le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| proc sql;
create table Feed_Cum as select distinct
t1.fiche,
t1.date,
t1.feed_lisse7j,
t1.age,
sum (t2.feed_lisse7j) as feed_cum
from feed_lisse2 t1
left join feed_lisse2 t2
on (t1.fiche = t2.fiche and t2.date between t1.first.date and t1.date)
group by 1,2,3;
quit; |
--> mon problème est que je n'arrive pas à lui déclarer qu'il prenne toujours la 1ère date. il me met une erreur de syntaxe sur t1.first.date
--> sinon, Est-ce que le code semble bon ?
- 2ème point, toujours sur la même table, je souhaite, pour chaque jour et par fiche, faire une soustraction de la colonne "feed_lisse7j", toujours à partir du 1er jour (23/11/2018).
Par exemple, pour le 26/11/2018, je veux faire la soustraction de "feed_lisse7j" : 26/11/2018 - 23/11/2018
et ainsi de suite pour chaque jour.
pour cela, j'ai mis le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| proc sql;
create table Feed_Cum as select distinct
t1.fiche,
t1.date,
t1.feed_lisse7j,
t1.age,
sum (t2.feed_lisse7j - t2.feed.lisse7j) as feed_cum
from feed_lisse2 t1
left join feed_lisse2 t2
on (t1.fiche = t2.fiche and t2.date between t1.first.date and t1.date)
group by 1,2,3;
quit; |
--> je ne sais pas si le code est correcte pour faire une soustraction ?
--> j'ai le même problème de syntaxe. je ne sais pas comment lui déclarer qu'il reparte toujours de la 1ère date ?
Merci de votre aide !!
Sommer ou soustraire des données par groupe
Bonjour,
Ça se fait très bien avec l'instruction retain dans une étape data :
• Constitution de la table test (préférez une étape data à une copie d'écran, c'est plus facile pour tester...)
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 test;
input fiche datet :$10. feed age;
cards;
58 23/11/2018 1558 99
58 24/11/2018 1733 100
58 25/11/2018 1722 101
58 26/11/2018 1743 102
58 27/11/2018 1783 103
58 28/11/2018 1872 104
58 29/11/2018 1893 105
58 30/11/2018 1922 106
58 01/12/2018 2019 107
59 23/11/2018 1628 99
59 24/11/2018 1731 100
59 25/11/2018 1854 101
59 26/11/2018 1888 102
59 27/11/2018 1887 103
59 28/11/2018 1837 104
59 29/11/2018 1828 105
59 30/11/2018 1821 106
59 01/12/2018 1801 107
63 23/11/2018 1186 99
63 24/11/2018 1304 100
63 25/11/2018 1402 101
63 26/11/2018 1509 102
63 27/11/2018 1600 103
63 28/11/2018 1854 104
63 29/11/2018 1876 105
63 30/11/2018 1949 106
run;
data test;
set test;
date=input(datet,ddmmyy10.);
format date ddmmyy10.;
run; |
• Somme cumulée par fiche
Code:
1 2 3 4 5 6 7
| data test;
set test;
by fiche;
if first.fiche then feedsum=feed;
else feedsum=feedsum+feed;
retain feedsum;
run; |
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
| fiche date feed feedsum
58 23/11/2018 1558 1558
58 24/11/2018 1733 3291
58 25/11/2018 1722 5013
58 26/11/2018 1743 6756
58 27/11/2018 1783 8539
58 28/11/2018 1872 10411
58 29/11/2018 1893 12304
58 30/11/2018 1922 14226
58 01/12/2018 2019 16245
59 23/11/2018 1628 1628
59 24/11/2018 1731 3359
59 25/11/2018 1854 5213
59 26/11/2018 1888 7101
59 27/11/2018 1887 8988
59 28/11/2018 1837 10825
59 29/11/2018 1828 12653
59 30/11/2018 1821 14474
59 01/12/2018 1801 16275
63 23/11/2018 1186 1186
63 24/11/2018 1304 2490
63 25/11/2018 1402 3892
63 26/11/2018 1509 5401
63 27/11/2018 1600 7001
63 28/11/2018 1854 8855
63 29/11/2018 1876 10731
63 30/11/2018 1949 12680 |
• Soustraction de la première observation de la fiche
Code:
1 2 3 4 5 6 7
| data test;
set test;
by fiche;
if first.fiche then feed0=feed;
feedsub=feed-feed0;
retain feed0;
run; |
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
| fiche date feed feedsub
58 23/11/2018 1558 0
58 24/11/2018 1733 175
58 25/11/2018 1722 164
58 26/11/2018 1743 185
58 27/11/2018 1783 225
58 28/11/2018 1872 314
58 29/11/2018 1893 335
58 30/11/2018 1922 364
58 01/12/2018 2019 461
59 23/11/2018 1628 0
59 24/11/2018 1731 103
59 25/11/2018 1854 226
59 26/11/2018 1888 260
59 27/11/2018 1887 259
59 28/11/2018 1837 209
59 29/11/2018 1828 200
59 30/11/2018 1821 193
59 01/12/2018 1801 173
63 23/11/2018 1186 0
63 24/11/2018 1304 118
63 25/11/2018 1402 216
63 26/11/2018 1509 323
63 27/11/2018 1600 414
63 28/11/2018 1854 668
63 29/11/2018 1876 690
63 30/11/2018 1949 763 |
Cordialement,