How about this? DATA TESTS; INPUT NAME $ SCORE1 SCORE2 SCORE3 SCORE4 SCORE5 SCORE6 SCORE7 SCORE8 SCORE9 SCORE10; CARDS; ALICE 100 97.3 88.9 85.5 91.2 88.8 93.4 98.1 100 92 CARRIE 88.7 81.4 92.8 92.1 93 93.7 92 81.9 85.5 84 DARRYL 92.3 91 91 86.9 85 84.1 81.8 87.5 91 92.3 FRANK 79.8 77 82 85.7 85.5 81.2 88 79.9 77 86.6 HOLLY 83.4 85.1 88.7 92 81.3 84 81.9 87.3 80.6 79.6 JENNIFER 85.3 88.6 87.1 82.9 89.5 88.7 92.8 95.8 93.3 98.2 JOHN 76.3 77.3 82.5 84 73.8 78.3 80.2 80.9 79.7 84.8 MIKE 100 100 97.6 96.7 99.8 98 95.9 97.8 100 97.3 SALLY 86.6 89 92.3 94.5 86.1 91 91.7 86.4 91 91.9 TOM 86.4 88.2 81.9 84 85 82.6 91.7 88.2 91.7 84.8 ; RUN; PROC SUMMARY DATA=TESTS; BY NAME; VAR SCORE1; OUTPUT OUT=STUDENTS SUM=; run; proc transpose data = tests out = foo; var score:; id name; run; proc sql; select name into: names separated by " " from tests; quit; %let num_students = %eval(%sysfunc(countw(&names.))); %macro ARRAY(); %DO i = 1 %to &num_students.; PROC SGPLOT DATA = foo; TITLE " Student's grade history"; VBAR %scan(&names., &i., " ") / FILL RESPONSE= %scan(&names., &i., " ") DATALABEL LEGENDLABEL='Students grades'; /* VBAR DATE / FILL RESPONSE=AVERAGE DATALABEL LEGENDLABEL='District averages';*/ XAXIS LABEL="Date"; YAXIS LABEL="Grades"; RUN; /* PROC TABULATE DATA=TESTS F=COMMA3.1;*/ /* WHERE name = %scan("&names.", &i., " ");*/ /* */ /* ......*/ /**/ /* RUN;*/ %END; %mend array; %array();
... View more