Hi Craig This is one solution: * Create some data for illustration purposes. INPUT PROGRAM. VECTOR ci(20F8.0) /q(20F8.0). LOOP cnt=1 TO 120. LOOP #cnt=1 TO 20. COMPUTE ci(#cnt)=TRUNC(UNIFORM(1)+.5)-3. COMPUTE q(#cnt)=TRUNC(UNIFORM(4)+.5). IF (UNIFORM(1)<.005) ci(#cnt)=-1. END LOOP. END CASE. END LOOP. END FILE. END INPUT PROGRAM. * Start the job. * Reformat from wide to long. LOOP q=1 TO 20. COMPUTE answeri=ci(q). COMPUTE answer=q(q). XSAVE OUTFILE='c:\temp\temp.sav' /KEEP=q answer answeri. END LOOP. EXECUTE. GET FILE='c:\temp\temp.sav'. FORMATS q(F4.0). * Disperse data to correct columns then calculate counts. VECTOR q(5F2.0) /qi(3F2.0). COMPUTE qi(answeri + 4)=1. COMPUTE q(answer+1)=1. AGGREGATE /OUTFILE=* /BREAK=q /qi1 TO qi3 = SUM(qi1 TO qi3) /q1 TO q5 = SUM(q1 TO q5) . * Calculate percentages. COMPUTE #sum1=SUM(qi1 TO qi3). VECTOR nb=qi1 TO q5 /pc(8F8.2). LOOP #=1 TO 8. COMPUTE pc(#)=nb(#)/#sum1. END LOOP. * move percentages to same columns as counts. VECTOR col=qi1 TO pc8 /c(8F8.2). LOOP #=1 TO 2. COMPUTE #base=(#-1)*8. LOOP #idx=1 TO 8. COMPUTE c(#idx)=col(#base + #idx). END LOOP. XSAVE OUTFILE='c:\temp\temp2.sav' /KEEP=q c1 TO c8. END LOOP. EXECUTE. GET FILE='c:\temp\temp2.sav'. * At this point, the required numbers are all available. SUMMARIZE /TABLES=q c1 c2 c3 c4 c5 c6 c7 c8 /FORMAT=VALIDLIST NOCASENUM TOTAL /TITLE='Case Summaries' /MISSING=VARIABLE /CELLS=COUNT . * Only cosmetic adjustments are missing (show % signs in % lines). * This requires creation of string variables. VECTOR col(8A5) /c=c1 TO c8. LOOP #=1 TO 8. DO IF MOD($CASENUM,2)=1. COMPUTE col(#)=STRING(c(#),F4.0). ELSE. COMPUTE col(#)=STRING(c(#)*100,PCT3.0). END IF. END LOOP. EXECUTE. VARIABLE LABEL col1 'Right' col2 'Wrong' col3 'Blank' col4 '0' col5 '1' col6 '2' col7 '3' col8 '4'. SUMMARIZE /TABLES=q col1 TO col8 /FORMAT=VALIDLIST NOCASENUM TOTAL /TITLE='Item Analysis' /MISSING=VARIABLE /CELLS=NONE.