this should do want you've requested within one datastep:
proc sort data =have; by by username dateonly betdate; run;
data want(drop= betdate dateonly stake type price sport TYPELIST PRICELIST) ;
set have;
LENGTH TYPELIST PRICELIST $200; *ARBITRARY LARGE LENGTH;
retain firsttype firstprice TYPELIST typecount PRICELIST pricecount soccercount baseballcount;
by username dateonly betdate;
if first.username then do ;
firsttype=type;
firstprice=PRICE;
typecount=0; pricecount=0; soccercount=0; baseballcount=0;
TYPELIST=""; PRICELIST="";
END;
if index(upcase(sport),'SOCCER') then soccercount+1;
if index(upcase(sport),'BASEBALL') then baseballcount+1;
IF find(TYPELIST,TYPE,'it')=0 THEN TYPELIST=CATX("|",TYPELIST,TYPE);
IF findc(PRICELIST,PRICE,'it')=0 THEN PRICELIST=CATX("|",PRICELIST,PRICE);
IF last.username THEN DO;
typecount=LENGTH(TYPELIST)-LENGTH(COMPRESS(TYPELIST,"|"))+1;
pricecount=LENGTH(PRICELIST)-LENGTH(COMPRESS(PRICELIST,"|"))+1;
OUTPUT;
END;
run;
proc print data=want;run;