/*Indlæser data og angiver længder*/ data johnson; infile 'a:johnson.txt' dlm=';' dsd firstobs=2; length FAKTURAKTO $15. KONTO $15. FAKTURADATO $15. BELOBDKK $15.; input FAKTURAKTO KONTO FAKTURADATO BELOBDKK; run; /*Laver et dataset der indeholder første kontonr (fakturakto) og tildeler positionsnr 1, 3, 5 .. */ data konto1 (rename=(fakturakto=nr)); set johnson(keep=fakturakto); retain taeller -1; taeller=taeller+2; run; /*Laver et dataset der indeholder anden kontonr (konto) og tildeler positionsnr 2, 4, 6 .. */ data konto2 (rename=(konto=nr)); set johnson(keep=konto); retain taeller 0; taeller=taeller+2; run; /*sætter de 2 dataset sammen*/ data konto; set konto1 konto2; run; /*sorterer på positionsnr*/ proc sort data=konto; by taeller; run; /*sorterer på nr og positionsnr*/ proc sort data=konto; by nr taeller; run; /*tager det første nummer og tilhørende positionstæller*/ data konto; set konto; by nr taeller; if first.nr; run; /*sorterer igen på positionstælleren*/ proc sort data=konto; by taeller; run; /*finder nyt kontonr*/ data nykonto; set konto(keep=nr); retain KONTO1 0; KONTO1=KONTO1+1; run; /*angiver rækkefølgen i oprindelige dataset*/ data johnson; set johnson; retain tue 0; tue=tue+1; run; /*sorterer efter første kontonr*/ proc sort data=johnson; by fakturakto; run; /*sorterer dataset der indeholder det nye kontonr efter oprindelige kontonr*/ proc sort data=nykonto; by nr; run; /*sammenkører johnson med nykonto og får dermed angivet konto1*/ data johnson (drop=nr); merge johnson(in=a rename=(fakturakto=nr)) nykonto(in=b); by nr; if a and b; run; /*sorterer nu efter andet kontonr*/ proc sort data=johnson; by konto; run; /*sammenkører og angiver konto2*/ data johnson (drop=nr); merge johnson(in=a rename=(konto=nr)) nykonto(in=b rename=(KONTO1=KONTO2)); by nr; if a and b; run; /*sorterer tilbage til oprindelige rækkefølge*/ proc sort data=johnson; by tue; run; /*finder dag, måned og år*/ data johnson2(drop=fakturadato tue belobdkk dato); set johnson; dato=input(fakturadato,ddmmyy10.); AAR=year(dato); MD=month(dato); DAG=day(dato); TID=dato-15613; KR=input(belobdkk,10.); format KR 10.2; run; /* Alternativ */ data johnson; infile 'a:johnson.txt' dlm=';' dsd firstobs=2; length FAKTURAKTO $15. KONTO $15. FAKTURADATO $15. BELOBDKK $15.; input FAKTURAKTO KONTO FAKTURADATO BELOBDKK; antal=1; run; /* Forudsætninger: 1. - Konto kun tilknyttet 1 fakturanr.*/ proc sort data=johnson out=test nodupkey; by konto fakturakto; run; proc sort data=test out=test nodupkey; by konto; run;/* 2. - Hvis konto og fakturanr er forskellige, vil kontonr ikke dukke op som fakturanr */ /* Finder antal af unikke fakturakto */ proc sort data=johnson out=test nodupkey; by fakturakto; run; /*Ny angivelse af konto*/ proc sort data=johnson out=test; by fakturakto konto; run; data nymetode; set test; by fakturakto konto; retain konto1 0; retain taeller 2372; if first.fakturakto then konto1=konto1+1; if fakturakto=konto then konto2=konto1; else do; if first.konto then do; konto2=taeller+1; taeller=taeller+1; end; else konto2=taeller; end; run; /* Sorterer minus beløb fra */ data minusbelob(keep=kr2 tid konto1 konto2); set johnson2; where kr<0; kr2=kr*-1; format KR2 10.2; run; proc sort data=minusbelob(rename=(kr2=kr)) nodupkey; by kr konto1 konto2 tid; run; proc sort data=johnson2; by kr konto1 konto2 tid; run; data johnson3; merge minusbelob(in=a) johnson2(in=b); by kr konto1 konto2 tid; if b and not a; run; /* transf*/ proc means data=johnson2 noprint; class konto1; var kr tid; output out=Sumdata (drop=_type_ _freq_ where=(konto1^=.)) sum(kr)=KR_SUM min(tid)=TID0 max(tid)=TID1 n(konto1)=ANTAL mean (kr)=KR_SNIT; run; data sumdata; set sumdata; MTID=(tid1-tid0)/(antal-1); run; /*finder antallet af transaktioner pr. mdr*/ proc summary data=johnson2 missing nway; class konto1 md; output out=johnson3(drop=_freq_ _type_) n(konto1)=ANTAL; run;