אחת מהיכולות השימושיות ביותר ב – SAS נקראת “by group processing” – עיבוד לפי קבוצות. יכולת זו באה לביטוי, בצורה מעט שונה אומנם, גם ב – data step וגם ברובם המוחלט של ה – proc-ים של SAS. הרעיון הוא ביצוע של חישוב או ניתוח מסוים עבור קבוצות נפרדות של רשומות בטבלה. המשתנה (עמודה) או משתנים אשר הערכים שלהם מזהים את הקבוצות הללו נקראים “by variables” ואנחנו צריכים שהטבלה תהיה ממוינת לפי העמודות הללו (טכנית יש גם אפשרויות אחרות במקום למיין את הטבלה אבל לא נדבר עליהן היום).
הדרך להפעיל את ה – “by group processing” הוא ע"י המילה השמורה “by” (מפתיע) ואחריה רשימה של המשתנים הרלוונטיים מופרדים ברווח.
כאשר מפעילים את ה – “by group processing” ב – data step אנחנו מקבלים שני משתנים וירטואליים שה - SAS יוצרת עבורנו באופן אוטומטי – הראשון מסמן לנו מתי מתחילה קבוצה של ערכים זהים ב – by variable שלנו והשני מתי הקבוצה הזו מסתיימת. ונעבור לדוגמא:
proc sort data=SASHELP.CLASS out=CLASS;
by sex;
run;
data CLASS1;
set CLASS;
by sex; * <- this does the magic!;
Is_First_Sex = first.sex; * <- yes the name of the automatic virtual variable includes the dot;
Is_Last_Sex = last.sex; * <- yes the name of the automatic virtual variable includes the dot;
run;
הכוונה ב – "משתנים וירטואליים" היא שהם לא נשמרים בטבלת הפלט שלנו ואם אנחנו כן רוצים לשמור אותם אנחנו צריכים לשמור את הערך שלהם למשתנים "רגילים". ככה הטבלה CLASS1 נראית:

שימוש אחד הוא לצבור ערכים בנפרד לכל קבוצה:
data CLASS2;
set CLASS;
by sex;
if first.sex then Total_Weight=0;
Total_Weight+weight;
run;
כמובן שיש עוד שימושים רבים מספור לפטנט הזה. שימוש נוסף לדוגמא הוא לשמור רק את הרשומה עם הערך הגבוה ביותר של מדד מסוים בקבוצה. למשל:
proc sort data=SASHELP.CARS out=CARS;
by type make msrp;
run;
data CARS_EXPENSIVE;
set CARS;
by type make;
if last.make then output;
run;
שימו לב שמיינו את הטבלה לפי יצרן, סוג ומחיר כדי לוודא שהרשומות מסודרות בסדר שאנחנו רוצים וב – data step העוקב השתמשנו רק ביצרן וסוג כדי לשמור את הרשומה האחרונה (כלומר עם המחיר הגבוה ביותר) בכל שילוב של יצרן וסוג.
ה – “by group processing” זמין גם ב – proc-ים של SAS ובהם הוא מאפשר לנו לבצע את הניתוח או החישוב של ה – proc לכל קבוצת רשומות בנפרד. למשל אם אנחנו רוצים לבנות מודל רגרסיה נפרד לגברים ולנשים נוכל להריץ את הקוד הבא:
proc reg data=class;
model weight=age height;
by sex;
run;
ונקבל בריצה אחת שני מודלים נפרדים (מוצגים רק חלק מהתוצרים המתקבלים):


חגי