برمجة SASتحليل البيانات

كيفية استخدام عبارة CASE WHEN في SAS (مع أمثلة)

دليل شامل ومفصل حول كيفية استخدام عبارة CASE WHEN في برمجية SAS وإجراء PROC SQL لمعالجة الشروط وإنشاء متغيرات جديدة بأمثلة عملية وتطبيقية.

تاريخ النشر

تُعد معالجة البيانات وإعادة هيكلتها وفق شروط منطقية محددة إحدى الركائز الأساسية التي يعتمد عليها محللو البيانات وعلماء الإحصاء في مختلف البيئات البرمجية. وفي سياق نظام التحليل الإحصائي SAS (Statistical Analysis System)، تمثل القدرة على تصنيف المتغيرات، وبناء المؤشرات المشتقة، والتحكم في تدفق التحويلات الحسابية، عنصراً جوهرياً لضمان جودة المخرجات التحليلية ودقتها. تبرز عبارة CASE WHEN المدمجة داخل إجراء PROC SQL كواحدة من أقوى الأدوات وأكثرها مرونة لتنفيذ هذا المنطق الشرطي المتقدم بأسلوب معياري يتوافق مع لغة الاستعلامات البنيوية القياسية.

يتيح فهم آليات عمل هذه العبارة للمبرمجين الانتقال بمهاراتهم من مجرد كتابة شروط بسيطة إلى بناء معماريات استعلامية معقدة قادرة على معالجة ملايين السجلات بكفاءة وسرعة فائقتين. إن الانتقال السلس بين المنطق الشرطي الإجرائي والمنطق التصريحي داخل بيئة SAS يمنح المطورين خيارات واسعة لتحسين الأداء البرمجي وتسهيل قراءة الأكواد وصيانتها. يهدف هذا المرجع الشامل إلى تفكيك البنية النحوية، والمفاهيم النظرية، والتطبيقات العملية لعبارة CASE WHEN في بيئة SAS، مقدماً دليلاً موسعاً يغطي كافة الجوانب بدءاً من الأساسيات النحوية وحتى السيناريوهات المتقدمة في بيئات الإنتاج والعمل الواقعية.

من خلال استعراض الأمثلة التطبيقية المعمقة، واستكشاف الفروق الدقيقة بينها وبين الأساليب التقليدية مثل خطوات معالجة البيانات (DATA Step)، سيتمكن القارئ من اكتساب فهم راسخ لكيفية إدارة القيم المفقودة، وتطبيق العمليات التجميعية المشروطة، وتحسين استهلاك موارد النظام أثناء التعامل مع قواعد البيانات الضخمة. يُشكل هذا المقال مرجعاً أكاديمياً وتطبيقياً متكاملاً لكل من يسعى إلى احتراف المنطق الشرطي في SAS PROC SQL وتطبيقه بكفاءة عالية في مشاريع التحليل الإحصائي وعلوم البيانات.

1. مقدمة إلى عبارة CASE WHEN في بيئة SAS وأهميتها التحليلية

1.1 مفهوم المنطق الشرطي في لغة SAS

يمثل المنطق الشرطي في بيئة برمجيات SAS حجر الزاوية في كافة عمليات هندسة الميزات وهيكلة البيانات وتنقيتها قبل إخضاعها للنماذج الإحصائية المتقدمة. تعتمد المعالجة الشرطية على فكرة تقييم تعبيرات منطقية معينة لتحديد مسار تنفيذ الأوامر البرمجية أو تعيين قيم محددة للمتغيرات بناءً على تحقق شروط مسبقة. في إدارة البيانات الإحصائية، تبرز الحاجة الملحة إلى إعادة تصنيف المتغيرات المستمرة إلى متغيرات فئوية، أو دمج فئات متعددة في تصنيفات موحدة لتسهيل قراءة الجداول التكرارية وبناء النماذج التنبؤية.

يتجلى الفارق التشغيلي بين المنطق التفرعي والمنطق التسلسلي في كيفية فحص محرك SAS للسجلات والبيانات المخزنة. فبينما يعتمد المنطق التسلسلي على قراءة السجلات واحداً تلو الآخر واختبار الشروط بالتتابع ضمن حلقة معالجة البيانات، يوفر المنطق التصريحي إمكانية تعريف النتائج المتوقعة استناداً إلى مجموعات البيانات ككل. إن القدرة على صياغة مقاييس كمية ونوعية جديدة بالاعتماد على معايير شرطية معقدة تمكن المحلل من استخلاص رؤى ذات دلالة إحصائية من البيانات الأولية دون الحاجة إلى تعديل الجداول المصدرية بصورة غير قابلة للاسترجاع.

علاوة على ذلك، فإن المنطق الشرطي يسهم في توحيد معايير جودة البيانات؛ حيث يمكن استخدام الشروط لاكتشاف وتصحيح التباينات في البيانات المدخلة، مثل التعامل مع الأخطاء الطباعية أو توحيد مسميات الكيانات. إن فهم الطبيعة الحسابية لتقييم العبارات الشرطية يضمن عدم إهدار دورات المعالجة المركزية (CPU Cycles)، مما ينعكس إيجاباً على استقرار وسرعة تنفيذ البرامج الإحصائية الكبرى.

1.2 موقع عبارة CASE ضمن إجراء PROC SQL

يعد إجراء PROC SQL في SAS نافذة قوية تتيح للمستخدمين استدعاء وتطبيق معايير لغة الاستعلامات البنيوية القياسية (ANSI SQL) مباشرة داخل البيئة التحليلية. ضمن هذا الإجراء، لا تعتبر عبارة CASE مجرد أداة شرطية عادية، بل هي تعبير قياسي ينتج عنه قيمة مفردة بناءً على تقييم الشروط المحددة، مما يجعلها متوافقة تماماً مع معايير قواعد البيانات العلائقية العالمية الحديثة.

يوفر استخدام عبارة CASE داخل PROC SQL مرونة استثنائية مقارنة بخطوات DATA Step التقليدية؛ حيث تتيح للمحلل دمج عمليات الفلترة، والتحويل الشرطي، وتجميع البيانات، وربط الجداول في استعلام موحد وموجز. يقلل هذا الأسلوب من الحاجة إلى إنشاء مجموعات بيانات وسيطة يتم حفظها على القرص الصلب، وهو ما يوفر مساحات تخزينية هائلة ويقلل من عمليات الإدخال والإخراج (I/O Operations) التي تمثل عادة عنق الزجاجة في معالجة البيانات الضخمة.

من الناحية الأدائية، يستفيد إجراء PROC SQL المعتمد على عبارات CASE من محركات التحسين المدمجة في SAS، والتي تعمل على تحسين خطة تنفيذ الاستعلام (Query Execution Plan). يظهر هذا التأثير بوضوح عند العمل مع قواعد البيانات المؤسسية الضخمة، حيث يمكن ترحيل معالجة الشروط مباشرة إلى خادم قاعدة البيانات المصدر، مما يرفع كفاءة المعالجة ويقلل زمن الاستجابة إلى أدنى حد ممكن.

1.3 الأهداف التعليمية للتطبيق العملي

يهدف هذا الدليل التطبيقي إلى تمكين الممارسين من صياغة استعلامات شرطية متقدمة بدقة برمجية متناهية، والابتعاد عن الأساليب البدائية التي قد تؤدي إلى نتائج غير دقيقة أو استهلاك غير مبرر لموارد النظام. يتطلب إتقان عبارة CASE استيعاباً كاملاً لقواعد البنية النحوية، ومعرفة دقيقة بكيفية تحديد أسماء المتغيرات وأنواعها، وضمان التوافق المنطقي التام بين مختلف الفروع الشرطية داخل الاستعلام الواحد.

سيكتسب القارئ القدرة على تصميم متغيرات تصنيفية متعددة الأبعاد تجمع بين المتغيرات الكمية والنوعية، مع مراعاة كافة الاحتمالات الاستثنائية مثل السجلات غير المكتملة أو القيم المتطرفة. كما سيركز المحتوى على بناء حس نقدي لاكتشاف الأخطاء المنطقية الشائعة التي لا تظهر كرسائل خطأ في سجل النظام (SAS Log)، ولكنها تؤدي إلى تحريف النتائج الإحصائية وتشويه دقة التقارير المستخرجة.

في نهاية المطاف، سيمتلك المبرمج المنهجية اللازمة لاختيار الأداة الأنسب لكل سيناريو تحليلي يواجهه، وتطبيق أفضل الممارسات البرمجية التي تضمن استدامة الأكواد وقابليتها للقراءة والمراجعة والتعديل من قبل فرق العمل التحليلية المتعددة التخصصات.

2. البنية النحوية الأساسية (Syntax) لعبارة CASE WHEN داخل PROC SQL

2.1 الصيغة العامة للعبارة الشرطية

تتألف البنية النحوية لعبارة CASE داخل إجراء PROC SQL من مجموعة محددة من الكلمات المفتاحية المحجوزة التي تعمل معاً بتناغم دقيق لإنشاء تعبير شرطي صالح للتنفيذ. تبدأ العبارة دائماً بالكلمة المفتاحية CASE، تليها واحدة أو أكثر من العبارات الشرطية المحددة بواسطة WHEN لتحديد الشرط المنطقي، متبوعة بالكلمة المفتاحية THEN لتحديد القيمة الناتجة في حال تحقق الشرط. وتختتم العبارة إلزامياً بالكلمة المفتاحية END التي تعلن لمحرك المعالجة نهاية التعبير الشرطي.

لتسمية العمود أو المتغير الجديد الناتج عن هذا التعبير في جدول المخرجات، يتم استخدام الكلمة المفتاحية AS تليها التسمية المرغوبة، مثل AS Variable_Name. يُعد هذا التعريف خطوة محورية لضمان إمكانية الإشارة إلى المتغير المشتق في العمليات اللاحقة وتنسيق التقارير النهائية بصورة واضحة ومنظمة.

من القواعد الصارمة في بناء عبارة CASE ضرورة توافق نوع البيانات (Data Type Consistency) بين كافة الفروع التابعة للكلمة THEN وفرع ELSE. فإذا كانت النتيجة المعادة في الفرع الأول نصية (Character)، يجب أن تكون كافة النتائج في الفروع الأخرى نصية أيضاً، وينطبق الأمر ذاته على البيانات الرقمية (Numeric). إن الإخلال بهذا التوافق يؤدي فوراً إلى توقف تنفيذ الاستعلام وصدور رسائل خطأ صريحة في سجل النظام تفيد بعدم تطابق الأنواع.

2.2 الترتيب المنطقي لتقييم الشروط

يعتمد محرك SAS في تقييم عبارة CASE على آلية الفحص التسلسلي الصارم من أعلى إلى أسفل وفق الترتيب الفيزيائي لكتابة شروط WHEN. بمجرد أن يجد المحرك شرطاً يتحقق لأحد السجلات، يقوم فوراً بإسناد القيمة المحددة في فرع THEN المقابل ويتوقف عن فحص باقي الشروط اللاحقة لذلك السجل، وينتقل مباشرة إلى معالجة السجل التالي في مجموعة البيانات.

يترتب على هذه الآلية ضرورة توخي أقصى درجات الحذر عند ترتيب الشروط لتفادي الوقوع في خطأ التداخل المنطقي (Logical Overlap). فالشروط الأكثر تحديداً وتخصيصاً يجب أن تأتي دائماً في المقدمة، تليها الشروط الأكثر عمومية وشمولاً؛ وذلك لضمان عدم حجب الحالات الخاصة بواسطة الشروط العامة السابقة لها في الترتيب.

يلعب الفرع الافتراضي ELSE دوراً حيوياً كشبكة أمان تلتقط كافة السجلات التي تفشل في تحقيق أي من شروط WHEN السابقة. يوفر هذا الفرع تحكماً كاملاً للمبرمج في كيفية معالجة الحالات غير المتوقعة أو الشاذة، وتعيين قيم افتراضية واضحة تمنع ترك الحقول فارغة بصورة غير مقصودة.

2.3 قواعد التنسيق ونظافة الكود المصدري

تعتبر نظافة الكود المصدري وتنسيقه البصري عاملاً حاسماً في تقليل الأخطاء وتسهيل الصيانة البرمجية، خاصة في بيئات العمل المشتركة. يوصى دائماً باستخدام المسافات البادئة (Indentation) بمقدار مسافتين أو أربع مسافات لكل فرع من فروع WHEN و THEN، مما يمنح الاستعلام هيكلية بصرية هرمية تتيح للعين تتبع المسارات المنطقية بسرعة وسهولة.

يعد التوثيق الداخلي عبر التعليقات التوضيحية ممارسة مهنية لا غنى عنها في المشاريع الإحصائية المعقدة. يفضل استخدام التعليقات متعددة الأسطر /* التعليق هنا */ أو أحادية الأسطر لشرح الغرض التحليلي من كل شرط وتوثيق أي افتراضات أو عتبات رقمية تم اعتمادها في التصنيف.

من الناحية الهيكلية لإجراء PROC SQL، يجب الانتباه دائماً إلى إنهاء الاستعلام بفاصلة منقوطة (Semicolon) في نهاية جملة SELECT، وإنهاء كامل الإجراء باستخدام الكلمة المفتاحية QUIT; بدلاً من الاكتفاء بكلمة RUN;؛ نظراً لأن PROC SQL هو إجراء تفاعلي (Interactive Procedure) يظل مفتوحاً في الذاكرة ويتطلب أمراً صريحاً بإنهائه وتحرير موارده.

3. التصنيفات الهيكلية لعبارة CASE: البسيطة مقابل المبحوثة (Simple vs Searched)

3.1 عبارة CASE البسيطة (Simple CASE Expression)

تعتمد عبارة CASE البسيطة على مقارنة متغير واحد أو تعبير حسابي مفرد بقائمة من القيم الثابتة المحددة. في هذه البنية، يوضع اسم المتغير مباشرة بعد الكلمة المفتاحية CASE، بينما تحتوي عبارات WHEN على القيم المتوقع مطابقتها فقط دون إعادة كتابة اسم المتغير أو استخدام معاملات المقارنة الرياضية.

تأخذ هذه الصيغة الهيكل العام التالي: CASE Variable_Name WHEN Value1 THEN Result1 WHEN Value2 THEN Result2 ELSE Default_Result END. تتميز هذه البنية بالبساطة والإيجاز الشديدين، مما يجعلها مثالية لعمليات فك التشفير البسيطة (Decoding) وإعادة ترميز المتغيرات الفئوية الاسمية التي لا تتطلب اختبارات منطقية معقدة.

تكمن محدودية هذه الصيغة في اقتصارها الصارم على عمليات المساواة المباشرة (Equality Tests) فقط مع قيم ثابتة ومفردة. لا يمكن داخل هذه الصيغة استخدام معاملات أكبر من أو أصغر من، كما لا يمكن تقييم متغيرات متعددة أو تطبيق دوال شرطية مركبة، مما يجعل نطاق استخدامها مقتصراً على سيناريوهات إعادة التعيين المباشر.

3.2 عبارة CASE المبحوثة (Searched CASE Expression)

تعتبر عبارة CASE المبحوثة الصيغة الأكثر قوة ومرونة وشمولاً في لغة SAS؛ حيث لا يتم وضع أي متغير بعد الكلمة المفتاحية CASE، بل تبدأ مباشرة بفحص تعبيرات منطقية كاملة ومستقلة بعد كل كلمة WHEN. يسمح هذا التصميم للمبرمج ببناء شروط تقييم مركبة تختبر قيماً وعلاقات رياضية متعددة في آن واحد.

تأخذ الصيغة المبحوثة الشكل التالي: CASE WHEN Condition1 THEN Result1 WHEN Condition2 THEN Result2 ELSE Default_Result END. تتيح هذه البنية حرية كاملة في اختبار متغيرات مختلفة تماماً ضمن فروع نفس العبارة؛ فيمكن لاختبار في الفرع الأول أن يقيم متغيراً رقمياً، بينما يختبر الفرع الثاني متغيراً نصياً، طالما أن القيم الناتجة في كافة فروع THEN متوافقة في نوع البيانات.

بفضل هذه المرونة، يمكن توظيف كافة المعاملات الرياضية والعلائقية مثل المقارنات المتقدمة، وفحص المجالات المغلقة، ومطابقة الأنماط النصية، واستدعاء الدوال المدمجة، مما يجعل العبارة المبحوثة الخيار القياسي لكافة المعالجات التحليلية المتقدمة وتصنيف البيانات المعقدة.

3.3 معايير الاختيار بين الصيغة البسيطة والمبحوثة

يتطلب اتخاذ القرار بشأن استخدام الصيغة البسيطة أو المبحوثة الموازنة بين عدة عوامل برمجية وتحليلية. إذا كان الهدف ينحصر في استبدال أكواد رقمية بنصوص وصفية مقابلة (مثل تحويل كود الحالة الاجتماعية 1 و 2 إلى ‘أعزب’ و ‘متزوج’)، فإن الصيغة البسيطة توفر وضوحاً فائقاً وتقلل من حجم الكود المكتوب وتجعله أسهل في القراءة والمراجعة السريعة.

في المقابل، عندما تشتمل متطلبات التحليل على نطاقات رقمية متدرجة، أو شروط تعتمد على التفاعل بين عدة متغيرات، أو التعامل مع حالات خاصة كفحص القيم المفقودة بصورة متزامنة، تصبح الصيغة المبحوثة هي الخيار الحتمي والوحيد القادر على تلبية هذه المتطلبات بكفاءة تامة.

من حيث كفاءة المعالجة والأداء، لا توجد فروق جوهرية ملحوظة في سرعة التنفيذ بين الصيغتين؛ حيث يقوم محرك تحسين الاستعلامات في SAS بترجمة الصيغة البسيطة داخلياً إلى ما يكافئها من عمليات بحث منطقية. لذلك، يجب أن يرتكز الاختيار بالدرجة الأولى على مقروئية الكود (Readability) وسهولة صيانته وتوسيعه في المستقبل من قبل فريق التطوير.

4. تطبيق عملي خطوة بخطوة: تصنيف بيانات الفرق الرياضية

4.1 إنشاء مجموعة البيانات التجريبية (Dataset Setup)

لتجسيد المفاهيم السابقة في سياق عملي تطبيقي، سنقوم بإنشاء مجموعة بيانات تجريبية تمثل إحصائيات أداء مجموعة من الفرق الرياضية في دوري محلي. تشتمل هذه البيانات على ثلاثة متغيرات أساسية: اسم الفريق (Team)، والنقاط المحرزة (Points)، وعدد المتابعات الناجحة (Rebounds). يتيح لنا هذا التنوع تطبيق مختلف أشكال التصنيف الشرطي واستعراض سلوك الاستعلامات بدقة.

يتم بناء الجدول التجريبي باستخدام خطوة DATA Step عبر إدخال السجلات مباشرة باستخدام تعليمة cards; أو datalines;، وتحديد أسماء وأطوال المتغيرات بدقة لضمان استقرار البنية الهيكلية للبيانات. يوضح الكود التالي كيفية إنشاء جدول البيانات المسمى original_data:


data original_data;
  input Team $ Points Rebounds;
  datalines;
A 25 10
B 18 6
C 30 12
D 12 4
E 22 9
F 15 5
;
run;

عقب تنفيذ خطوة الإنشاء، يتم التحقق من سلامة البيانات المدخلة وبنيتها الهيكلية باستخدام إجراء PROC PRINT للتأكد من خلوها من الأخطاء الطباعية أو الإزاحات في الأعمدة، ولتوفير نقطة مرجعية واضحة يمكن من خلالها مقارنة المخرجات التي ستنتج عن استعلامات SQL اللاحقة.

4.2 تنفيذ استعلام تصنيف الأقسام (Divisions)

سنقوم الآن بتطبيق استعلام PROC SQL لتصنيف الفرق الرياضية جغرافياً إلى قسمين رئيسيين: القسم الشرقي (East) والقسم الغربي (West) بناءً على اسم الفريق. يتطلب هذا الإجراء استخدام عبارة CASE لفحص قيمة المتغير النصي Team وإسناد التصنيف المناسب لكل سجل، مع الاحتفاظ بجميع المتغيرات الأصلية في جدول المخرجات الجديد.

يتم بناء الاستعلام واستخراج النتائج في جدول جديد يسمى classified_teams كما هو موضح في الكود التالي:


proc sql;
  create table classified_teams as
  select Team,
         Points,
         Rebounds,
         case Team
           when 'A' then 'East'
           when 'B' then 'East'
           when 'C' then 'East'
           when 'D' then 'West'
           when 'E' then 'West'
           else 'Unknown'
         end as Division
  from original_data;
quit;

في هذا الاستعلام، تم استخدام الكلمة المفتاحية as Division لإنشاء عمود نصي جديد يحمل اسم التصنيف. لاحظ كيف تم تضمين الفرع else 'Unknown' لضمان التعامل الآمن مع أي فريق إضافي قد لا يندرج تحت القوائم المحددة صراحة في عبارات WHEN.

case when statement in SAS example
case when statement in SAS example

4.3 تحليل مخرجات الاستعلام ومطابقتها

عند مراجعة الجدول الناتج classified_teams، نلاحظ أن النظام قام بمعالجة كل سجل على حدة وفق المنطق المحدد؛ حيث تم تصنيف الفرق A و B و C بنجاح ضمن القسم ‘East’، في حين صُنفت الفرق D و E ضمن القسم ‘West’. أما الفريق F، ونظراً لعدم ذكره صراحة في أي من عبارات WHEN، فقد تم التقاطه تلقائياً بواسطة فرع ELSE وتعيين القيمة ‘Unknown’ له.

تثبت هذه النتيجة الأهمية البالغة للتحكم في كافة المسارات المنطقية الممكنة داخل الاستعلام. فبدون وجود فرع ELSE، لكانت القيمة المخصصة للفريق F هي قيمة نصية فارغة أو مفقودة، مما قد يسبب تشوهات تحليلية عند إجراء عمليات التجميع والعد اللاحقة.

إن المتغير الجديد المستحدث Division أصبح الآن جاهزاً للاستخدام كمتغير فئوي مستقل في مختلف الإجراءات الإحصائية الأخرى في SAS، مثل إجراءات تحليل التباين (ANOVA) أو جداول الاقتران الإحصائي (Crosstabs)، مما يوضح القوة التحويلية لعبارة CASE في إعداد البيانات للنمذجة المتقدمة.

5. التعامل مع الشروط المركبة والمعاملات المنطقية (AND / OR)

5.1 دمج المعامل المنطقي AND في عبارات WHEN

في كثير من التطبيقات التحليلية الواقعية، لا يكفي الاعتماد على معيار تقييم مفرد لاتخاذ قرارات التصنيف، بل يتطلب الأمر تحقق مجموعة من المعايير المتزامنة. يتيح دمج المعامل المنطقي AND داخل عبارات WHEN في الصيغة المبحوثة ربط شروط متعددة تتطلب جميعها أن تكون نتيجتها صحيحة (True) لتنفيذ الفرع المقابل وإسناد النتيجة.

يمكن على سبيل المثال تصنيف أداء الفرق الرياضية إلى مستويات نوعية مثل ‘Elite’ أو ‘Average’ بناءً على تقييم مشترك لكل من النقاط والمتابعات معاً. يُظهر الكود التالي كيفية تطبيق المعامل AND لبناء مقياس أداء متقدم:


proc sql;
  select Team, Points, Rebounds,
         case
           when Points >= 20 and Rebounds >= 10 then 'Tier 1 - Elite'
           when Points >= 15 and Rebounds >= 5 then 'Tier 2 - Good'
           else 'Tier 3 - Developing'
         end as Performance_Tier
  from original_data;
quit;

يجب دائماً مراعاة أسبقية العمليات الحسابية والمنطقية؛ حيث يمتلك المعامل AND أسبقية تنفيذ أعلى من المعامل OR. ولتجنب أي لبس أو أخطاء غير مقصودة في تفسير المحرك للشروط المعقدة، يُنصح دائماً باستخدام الأقواس الدائرية ( ) لتحديد أولويات التقييم المنطقي بدقة ووضوح.

5.2 تطبيق المعامل المنطقي OR لتجميع الفئات المتعددة

يُستخدم المعامل المنطقي OR عندما يكون المطلوب تجميع عدة حالات شرطية متباينة تؤدي جميعها إلى نفس النتيجة التصنيفية. يكتفي هذا المعامل بتحقق شرط واحد فقط من الشروط المرتبطة به لاعتبار التعبير ككل صحيحاً وتنفيذ فرع THEN المقابل.

على الرغم من فاعلية المعامل OR، فإن كتابة سلاسل طويلة منه مثل Team = 'A' or Team = 'B' or Team = 'C' تجعل الكود طويلاً وعرضة للأخطاء. كبديل أكثر أناقة وكفاءة، تدعم عبارة CASE المبحوثة استخدام معامل الانتماء IN، والذي يختصر هذه السلاسل في تعبير مدمج مثل Team in ('A', 'B', 'C').

يوضح المثال التالي الفرق في تحسين المقروئية عند استخدام معامل IN لتجميع الأقسام الرياضية بدلاً من معاملات OR المتكررة:


proc sql;
  select Team,
         case
           when Team in ('A', 'B', 'C') then 'Eastern Conference'
           when Team in ('D', 'E', 'F') then 'Western Conference'
           else 'Other'
         end as Conference
  from original_data;
quit;

يؤدي استخدام معامل IN إلى تحسين وضوح الكود وسهولة صيانته وإضافة فئات جديدة مستقبلاً، فضلاً عن تمكين محرك الاستعلام من تطبيق خوارزميات بحث أسرع على مستوى المعالجة الداخلية.

5.3 المعاملات العلائقية المتقدمة (BETWEEN, LIKE, NOT)

توفر لغة SQL في SAS مجموعة متميزة من المعاملات العلائقية المتقدمة التي ترفع من كفاءة عبارة CASE وتسهل صياغة الشروط التخصصية. يُعد المعامل BETWEEN … AND … من أكثر المعاملات استخداماً لتحديد النطاقات الرقمية والزمنية المغلقة؛ حيث يقوم باختبار ما إذا كانت قيمة المتغير تقع ضمن مجال يشمل قيمتي البداية والنهاية بصورة شاملة (Inclusive).

أما المعامل LIKE، فيُستخدم لمطابقة الأنماط النصية المتقدمة عبر استخدام الرموز البديلة (Wildcards) مثل علامة النسبة المئوية % لمطابقة أي عدد من الحروف، أو علامة الشرطة السفلية _ لمطابقة حرف واحد فقط. يتيح ذلك تصنيف النصوص بناءً على بداياتها، أو نهاياتها، أو احتوائها على مقاطع معينة دون الحاجة إلى مطابقة السلسلة النصية بالكامل.

إضافة إلى ذلك، يلعب معامل النفي NOT دوراً محورياً في صياغة شروط الاستبعاد المنطقي الدقيقة، حيث يمكن دمجه مع المعاملات السابقة مثل NOT IN أو NOT BETWEEN أو NOT LIKE لاستثناء شرائح محددة من البيانات وتوجيهها إلى مسارات معالجة مختلفة، مما يمنح المبرمج تحكماً كاملاً وشاملاً في أدق تفاصيل منطق التصنيف.

6. معالجة القيم المفقودة (Missing Values) ودور العبارة الافتراضية ELSE

6.1 طبيعة معالجة القيم المفقودة في SAS

تمتلك بيئة SAS خصوصية فريدة في كيفية تمثيل وتخزين القيم المفقودة (Missing Values)، وهو ما يفرض على المحلل فهماً عميقاً لسلوك هذه القيم داخل التعبيرات الشرطية. في SAS، يتم تمثيل القيمة المفقودة للمتغيرات الرقمية بنقطة مفردة .، ويتم التعامل معها حسابياً على أنها تمثل أصغر قيمة رقمية ممكنة، أي أنها أصغر من أي رقم سالب معروف (تعتبر نظرياً مساوية لما لا نهاية السالبة).

يترتب على هذه الخصوصية خطر منطقي بالغ؛ فإذا تمت كتابة شرط مثل when Points < 20 then 'Low Score'، فإن أي سجل يحتوي على قيمة مفقودة في عمود النقاط سيتحقق فيه هذا الشرط تلقائياً، وسيتم تصنيفه ضمن فئة ‘Low Score’ لأن النقطة أصغر من الرقم 20. يؤدي هذا السلوك إلى تشويه التحليل الإحصائي دون صدور أي رسالة تحذيرية في سجل النظام.

أما بالنسبة للمتغيرات النصية، فتُعامل القيم المفقودة على أنها سلاسل نصية فارغة ذات طول صفري أو مسافات بيضاء، وتعتبر أصغر من أي نص يبدأ بحروف أبجدية في ترتيب الفهرسة. لذلك، يجب دائماً فحص القيم المفقودة صراحة في بداية عبارة CASE قبل تطبيق أي مقارنات رقمية أو نصية أخرى.

6.2 استخدام دالتي IS NULL و MISSING

للتعامل الاحترافي مع مشكلة القيم المفقودة، توفر SAS أدوات مخصصة تضمن التحقق الدقيق من وجود البيانات واكتمالها. يمكن استخدام المعامل القياسي IS NULL أو المعامل المكافئ له IS MISSING مباشرة داخل شروط WHEN لاكتشاف السجلات الفارغة وتوجيهها إلى تصنيف مستقل ومحدد.

كذلك يمكن استدعاء دالة SAS المدمجة MISSING() داخل استعلام SQL، وهي دالة فائقة المرونة تقبل المتغيرات الرقمية والنصية على حد سواء، وتعيد القيمة 1 (صحيح) إذا كانت القيمة مفقودة، أو القيمة 0 (خطأ) إذا كانت القيمة مكتملة وصالحة. يوضح المثال التالي كيفية عزل القيم المفقودة كخطوة أولى في المعالجة الشرطية:


proc sql;
  select Team, Points,
         case
           when Points is null then 'Missing / Not Recorded'
           when Points >= 20 then 'High Scorer'
           when Points < 20 then 'Standard Scorer'
           else 'Other'
         end as Score_Category
  from original_data;
quit;

يضمن هذا الترتيب الدقيق التقاط السجلات التي تفتقر إلى البيانات المكتملة أولاً، وتصنيفها بشكل صريح وشفاف يمنع تداخلها غير المقصود مع الفئات العددية الحقيقية للبيانات.

6.3 أهمية تضمين عبارة ELSE الاستباقية

يعد تضمين فرع ELSE في كل عبارة CASE ممارسة قياسية لا غنى عنها لضمان متانة الكود وجودة البيانات. وفقاً لمعايير SQL في SAS، إذا لم يقم المبرمج بكتابة فرع ELSE ولم يتحقق أي من شروط WHEN لأحد السجلات، فإن النظام سيسند تلقائياً قيمة مفقودة (Missing Value) لذلك السجل في العمود الناتج.

قد يؤدي هذا السلوك الافتراضي الصامت إلى صعوبة اكتشاف الأخطاء؛ حيث لا يستطيع المحلل التمييز بسهولة بين ما إذا كانت القيمة المفقودة ناتجة عن فقدان البيانات في المصدر الأصلي، أو أنها ناتجة عن نقص في تغطية الشروط المنطقية داخل الاستعلام. يساعد تعيين قيمة واضحة في فرع ELSE مثل ‘Uncategorized’ أو ‘Review Required’ في تحويل هذه الحالات إلى مؤشرات رقابية فورية.

يعمل فرع ELSE الاستباقي كأداة تدقيق ومراقبة مستمرة لجودة البيانات الواردة (Data Quality Monitoring)؛ فإذا ظهرت هذه التسمية في التقارير الإحصائية النهائية، فإن ذلك ينبه الفريق التحليلي فوراً إلى وجود أنماط جديدة أو غير متوقعة في البيانات تتطلب تحديث الاستعلامات وقواعد التصنيف لتشملها.

7. استخدام CASE WHEN مع الدوال التجميعية وعمليات التلخيص (Aggregation)

7.1 الحساب المشروط للتكرارات والمجموع (Conditional Counting & Summing)

يمثل دمج عبارة CASE داخل الدوال التجميعية (Aggregate Functions) مثل SUM() و COUNT() و AVG() إحدى أقوى التقنيات التحليلية في SAS SQL. يُعرف هذا النمط البرمجي باسم التجميع المشروط (Conditional Aggregation)، ويتيح للمحلل استخلاص مؤشرات إحصائية متعددة وفئات فرعية مختلفة في استعلام تلخيصي واحد فائق السرعة.

يعتمد النمط الشائع لحساب التكرارات المشروطة على صياغة التعبير: SUM(case when condition then 1 else 0 end). في هذا التعبير، يتم إرجاع الرقم 1 لكل سجل يحقق الشرط والرقم 0 لكل سجل لا يحققه، ثم تقوم دالة SUM بجمع هذه الآحاد لتنتج العدد الدقيق للسجلات المطابقة للشرط دون الحاجة إلى فلترة مجموعة البيانات بالكامل.

يوضح الاستعلام التالي كيفية حساب إجمالي عدد الفرق، وعدد الفرق ذات الأداء العالي، ومجموع نقاط الفرق في القسم الشرقي في خطوة واحدة:


proc sql;
  select count(*) as Total_Teams,
         sum(case when Points >= 20 then 1 else 0 end) as High_Scoring_Teams_Count,
         sum(case when Team in ('A', 'B', 'C') then Points else 0 end) as Eastern_Total_Points
  from original_data;
quit;

يقضي هذا الأسلوب تماماً على الحاجة لإنشاء جداول مؤقتة متعددة أو تشغيل استعلامات فرعية متتالية، مما يقلل بشكل جذري من استهلاك الذاكرة وزمن المعالجة على مجموعات البيانات الضخمة.

7.2 الدمج مع جملة GROUP BY

تتضاعف القوة التحليلية لعبارة CASE عند دمجها مع بند التجميع GROUP BY؛ حيث يمكن تقسيم البيانات وتلخيصها إحصائياً بناءً على الفئات المستحدثة المشتقة من التعبير الشرطي مباشرة. يتيح ذلك إنشاء تقارير إحصائية مقارنة بين المجموعات المصنفة حديثاً بكل سهولة ويسر.

في SAS PROC SQL، يمكن استخدام الاسم المستعار (Alias) المحدد في جملة SELECT مباشرة داخل بند GROUP BY، أو إعادة كتابة تعبير CASE كاملاً ضمن بند التجميع وفق المعايير البرمجية الصارمة. يوضح المثال التالي كيفية حساب متوسط النقاط والمتابعات لكل مستوى أداء مشتق:


proc sql;
  select case
           when Points >= 20 then 'High Tier'
           else 'Standard Tier'
         end as Performance_Group,
         count(*) as Number_of_Teams,
         avg(Points) as Mean_Points format=8.2,
         avg(Rebounds) as Mean_Rebounds format=8.2
  from original_data
  group by Performance_Group;
quit;

يقوم محرك الاستعلام أولاً بتقييم عبارة CASE لتحديد الفئة الخاصة بكل سجل، ثم يقوم بتجميع السجلات المتشابهة وحساب المقاييس الإحصائية المحددة لكل مجموعة، مقدماً جدولاً تلخيصياً بالغ الدقة والوضوح وجاهزاً للعرض المباشر.

7.3 الفلترة المتقدمة للمجاميع باستخدام HAVING

في التحليلات المتقدمة، تنشأ الحاجة إلى تصفية المجموعات التلخيصية بناءً على نتائج العمليات الحسابية والتجميعية المشروطة. يُستخدم بند HAVING حصرياً لفلترة المخرجات المجمعة الناتجة عن جملة GROUP BY، متميزاً عن بند WHERE الذي يقتصر دوره على تصفية السجلات الفردية قبل دخولها في عملية التجميع.

يمكن تضمين تعبيرات CASE داخل بند HAVING لفرض شروط تصفية مركبة على المجاميع. على سبيل المثال، يمكن قصر عرض التقرير النهائي على الأقسام التي تمتلك عدداً معيناً من الفرق ذات الأداء المرتفع فقط، كما يظهر في الاستعلام التالي:


proc sql;
  select case
           when Team in ('A', 'B', 'C') then 'East'
           else 'West'
         end as Division,
         count(*) as Total_Teams,
         sum(case when Points >= 20 then 1 else 0 end) as Elite_Teams
  from original_data
  group by Division
  having sum(case when Points >= 20 then 1 else 0 end) >= 1;
quit;

يوفر هذا التكامل بين CASE و GROUP BY و HAVING بنية تحليلية متكاملة تتيح استخلاص المعرفة وتطبيق الفلاتر الإحصائية المعقدة في تمريرة برمجية واحدة تتسم بالكفاءة والسرعة الفائقة.

8. مقارنة متعمقة: CASE WHEN في PROC SQL مقابل IF-THEN/ELSE في DATA Step

8.1 الفروق الجوهرية في فلسفة المعالجة

يرتكز الاختيار بين عبارة CASE في PROC SQL وأوامر IF-THEN/ELSE في خطوة DATA Step على فهم الفلسفة التشغيلية العميقة لكل منهما داخل نظام SAS. تعمل خطوة DATA Step وفق نموذج معالجة إجرائي (Procedural Model) يعتمد على حلقة تكرارية صريحة لسجلات البيانات (Program Data Vector – PDV)، حيث يقرأ النظام سجلاً واحداً في كل دورة ويطبق عليه الأوامر خطوة بخطوة بالتتابع.

في المقابل، يتبنى إجراء PROC SQL النموذج التصريحي (Declarative Model) الخاص بلغة SQL، حيث يحدد المبرمج “ما هي النتيجة المطلوبة” ويترك للمحرك الداخلي تحديد “كيفية تنفيذ المعالجة” بأفضل مسار ممكن. يمنح هذا النموذج ميزة استثنائية لـ PROC SQL عند الحاجة إلى دمج البيانات من جداول متعددة عبر عمليات الربط (SQL Joins) بالتزامن مع تطبيق الشروط المنطقية، دون الحاجة إلى فرز الجداول مسبقاً كما تتطلب خطوة DATA Step المعتمدة على MERGE.

فيما يتعلق بالخصائص والسمات (Attributes)، تحدد خطوة DATA Step طول المتغير الحرفي الجديد تلقائياً بناءً على أول إسناد ما لم يتم تعريفه مسبقاً بتعليمة LENGTH، وهو ما ينطبق أيضاً على عبارة CASE في SQL، ولكن مع فروق دقيقة في كيفية تعامل المحرك مع المساحات المتروكة في الذاكرة التخزينية.

8.2 مقارنة كفاءة الأداء واستخدام الموارد

تختلف كفاءة الأداء بين الطريقتين باختلاف طبيعة المهمة وحجم مجموعة البيانات. في العمليات الحسابية المعقدة ومعالجة النصوص المكثفة داخل ملفات البيانات الضخمة المخزنة محلياً، تتميز خطوة DATA Step غالباً بسرعتها وتفوقها الطفيف في استهلاك الذاكرة ودورات المعالج، نظراً لخفتها وتحكمها المباشر في مؤشرات السجلات دون أي حمل إضافي لمحرك الاستعلام.

ومع ذلك، يبرز تفوق PROC SQL وعبارة CASE بشكل كاسح في حالتين رئيسيتين: الأولى هي العمليات التي تتطلب ربط وتجميع وتلخيص مشروط في نفس الخطوة البرمجية، حيث يوفر SQL إنشاء مراحل وسيطة توفر وقت الإدخال والإخراج. والحالة الثانية هي التعامل مع قواعد البيانات العلائقية الخارجية عبر الاتصال المباشر؛ حيث يمكن لـ SQL ترحيل المعالجة الشرطية إلى محرك الخادم الأصلي، مما يلغي الحاجة لنقل ملايين السجلات الخام عبر شبكة الاتصال إلى بيئة SAS المحلية.

يلعب وجود الفهارس (Indexes) دوراً مهماً أيضاً؛ حيث يستطيع محسن استعلامات PROC SQL استغلال الفهارس المركبة لتسريع تقييم شروط CASE WHEN و WHERE بكفاءة عالية تضاهي أو تتفوق على المعالجة الإجرائية في بيئات التخزين المهيكلة.

8.3 جدول مقارنة شامل للخصائص والمميزات

لتلخيص الفروق الدقيقة والمساعدة في اتخاذ القرار البرمجي الأمثل، يوضح الاستعراض التالي مقارنة هيكلية شاملة بين التقنيتين عبر أهم المحاور التشغيلية والبرمجية:

  • فلسفة المعالجة: PROC SQL تعتمد الأسلوب التصريحي القائم على المجموعات (Set-based)، بينما DATA Step تعتمد الأسلوب الإجرائي المعتمد على السجل تلو الآخر (Record-by-record).
  • إمكانية دمج الجداول: تتفوق PROC SQL بقدرتها على الربط الشرطي دون الحاجة لفرز الجداول مسبقاً بأمر PROC SORT، في حين تلزم خطوة DATA Step إجراء فرز مسبق لكافة الجداول المدمجة.
  • إنشاء متغيرات متعددة: تتيح خطوة DATA Step إنشاء وتعديل عشرات المتغيرات المستقلة ضمن مسار شرطي واحد باستخدام كتل DO; ... END;، بينما تتطلب PROC SQL كتابة عبارة CASE مستقلة ومخصصة لكل متغير جديد يتم اشتقاقه.
  • التوافقية مع الأنظمة الخارجية: تتمتع عبارة CASE بتوافقية معيارية عالمية يمكن تمريرها لمحركات قواعد البيانات مثل Oracle و Teradata و SQL Server، بينما تنحصر أوامر DATA Step داخل بيئة محرك SAS الحصري.
  • سهولة الصيانة والمقروئية: تتميز عبارات CASE في SQL بمقروئية ممتازة وتنسيق قياسي موحد يسهل فهمه من قبل كافة محللي البيانات حتى لو لم يكونوا مبرمجي SAS متخصصين.

9. توليد المتغيرات الرقمية والحسابات الرياضية المتقدمة عبر CASE WHEN

9.1 التحويلات الحسابية الديناميكية

لا يقتصر دور عبارة CASE على تصنيف النصوص وإسناد التسميات الوصفية، بل تمتد إمكانياتها لتشمل تنفيذ عمليات رياضية وحسابات تفاضلية ديناميكية تختلف معادلتها باختلاف شريحة البيانات. يتيح ذلك تطبيق نماذج تسعير متغيرة، أو حساب نسب الضرائب المتدرجة، أو تعديل المقاييس بناءً على أوزان إحصائية متغيرة لكل فئة.

من أهم التطبيقات الوقائية للتحويلات الديناميكية هي الحماية الاستباقية من أخطاء القسمة على صفر (Division by Zero Errors)، والتي قد تتسبب في توقف تنفيذ الاستعلام أو إنتاج قيم غير معرفة في التقارير الإحصائية. يمكن تضمين شرط وقائي داخل عبارة CASE يفحص المقام قبل تنفيذ العملية الحسابية، كما يوضح المثال التالي:


proc sql;
  select Team, Points, Rebounds,
         case
           when Rebounds > 0 then (Points / Rebounds)
           else 0
         end as Points_Per_Rebound_Ratio format=8.2
  from original_data;
quit;

يضمن هذا الأسلوب استقرار المعالجة وسلامة المخرجات الحسابية، وتطبيق نسب تعديل مخصصة لكل سجل وفق حالته الفريدة بسلاسة تامة.

9.2 إنشاء المتغيرات الثنائية (Dummy Variables / One-Hot Encoding)

تتطلب العديد من خوارزميات النمذجة الإحصائية المتقدمة وتعلم الآلة في SAS، مثل نماذج الانحدار الخطي المتعدد (Multiple Linear Regression) ونماذج الانحدار اللوجستي (Logistic Regression)، تحويل المتغيرات الفئوية الاسمية إلى مجموعة من المتغيرات الثنائية أو المؤشرات الرقمية (Dummy Variables) التي تأخذ القيمة 1 أو 0، وهي العملية المعروفة باسم One-Hot Encoding.

توفر عبارة CASE الطريقة الأكثر وضوحاً وكفاءة لإنشاء هذه المتغيرات المؤشرة مباشرة داخل استعلام SQL التحضيري، كما يظهر في التطبيق العملي التالي لتحويل الفرق إلى متغيرات ثنائية مستقلة:


proc sql;
  create table model_ready_data as
  select Team, Points, Rebounds,
         case when Team = 'A' then 1 else 0 end as Team_A_Ind,
         case when Team = 'B' then 1 else 0 end as Team_B_Ind,
         case when Team = 'C' then 1 else 0 end as Team_C_Ind
  from original_data;
quit;

تتيح هذه البنية النظيفة توليد مصفوفات التصميم (Design Matrices) المطلوبة للتحليلات القياسية بكل دقة، مع التحكم الكامل في تحديد فئة المرجع الأساسية (Reference Category) عبر استبعادها من قائمة المتغيرات الثنائية المشتقة.

9.3 التعشيش الرياضي للدوال الإحصائية داخل CASE

تتيح لغة SAS مرونة مطلقة في تعشيش الدوال الإحصائية والرياضية المدمجة (مثل الدوال اللوغاريتمية LOG، والانحراف المعياري STD، وحساب الجذور SQRT، والتقريب ROUND) مباشرة داخل فروع THEN أو حتى داخل شروط WHEN التابعة لعبارة CASE.

تستخدم هذه الإمكانية المتقدمة على نطاق واسع في معالجة وتطبيع القيم المتطرفة (Outlier Winsorization / Truncation) وفق عتبات إحصائية ديناميكية؛ حيث يمكن استبدال القيم الشاذة التي تتجاوز حداً إحصائياً معيناً بقيمة العتبة القصوى أو بتطبيق تحويل لوغاريتمية عليها لتقليل تشتتها.

علاوة على ذلك، يمكن تطبيق عمليات توحيد المقاييس (Normalization) بحساب الدرجات المعيارية (Z-Scores) بصورة مشروطة لكل مجموعة فئوية على حدة، مما يرفع من جودة البيانات ويجعلها مهيأة بدرجة عالية للدخول في التحليلات الإحصائية متعددة المتغيرات.

10. أفضل الممارسات لتحسين أداء الاستعلامات وضمان دقة النتائج

10.1 ضبط أطوال المتغيرات الحرفية (LENGTH Specification)

من أهم القواعد الفنية التي يجب على مبرمج SAS إدراكها هي الكيفية التي يحدد بها النظام طول ونوع المتغير النصي المشتق من عبارة CASE. يقوم محرك SAS بتحديد الطول التخزيني للمتغير الجديد استناداً إلى طول أطول نص في الفرع الأول المكتوب (أول جملة THEN)، ما لم يتم التصريح بطول المتغير صراحة.

يترتب على ذلك خطر تقطيع النصوص (String Truncation)؛ فإذا كانت نتيجة فرع THEN الأول هي كلمة قصيرة مثل ‘East’ (طولها 4 أحرف)، وكان هناك فرع لاحق يعيد كلمة أطول مثل ‘Western Conference’ (طولها 18 حرفاً)، فإن SAS ستقوم باقتطاع النص الطويل ليصبح ‘West’ فقط ليتناسب مع الطول المحجوز (4 أحرف)، مما يؤدي إلى تشويه البيانات وظهور نتائج خاطئة.

لتفادي هذه المشكلة الخطيرة، يجب دائماً استخدام تعليمة LENGTH أو دالة التنسيق المباشر، أو استخدام عبارة LENGTH = xx لتحديد الحد الأقصى للمتغير الحرفي قبل الدخول في استعلام SELECT، أو ضبط طول الفرع الأول النصي ليكون كافياً لاستيعاب أطول نص محتمل في كافة الفروع.

10.2 تحسين ترتيب الشروط لرفع سرعة المعالجة

نظراً لآلية التقييم التسلسلي من الأعلى إلى الأسفل، فإن ترتيب كتابة الشروط يلعب دوراً مباشراً في تحديد عدد المقارنات المنطقية التي يضطر المعالج لتنفيذها لكل سجل. لتحقيق أقصى كفاءة تشغيلية وسرعة تنفيذ، تقضي أفضل الممارسات البرمجية بوضع الشروط الأكثر تكراراً واحتمالاً للتحقق في مقدمة عبارة CASE.

على سبيل المثال، إذا كانت مجموعة البيانات تحتوي على مليون سجل، وكانت 80% من السجلات تنتمي للفئة ‘Standard’ و 20% تنتمي للفئة ‘Premium’، فإن وضع شرط الفئة ‘Standard’ كأول عبارة WHEN سيؤدي إلى إنهاء تقييم 800,000 سجل من المقارنة الأولى، وتوفير مئات الآلاف من المقارنات غير الضرورية لباقي الفروع.

كما يجب تجنب الشروط الزائدة أو الحسابات المتكررة داخل شروط WHEN؛ حيث يفضل دائماً تبسيط التعبيرات الجبرية والمنطقية لأبسط صورة ممكنة لتقليل الجهد الحسابي المبذول على كل سجل في مجموعات البيانات الضخمة.

10.3 الاستفادة من تقنية SQL Pass-Through

عند الاتصال بمستودعات البيانات الضخمة وقواعد البيانات المؤسسية مثل Oracle أو Snowflake أو Amazon Redshift عبر واجهة SAS/ACCESS، تبرز تقنية SQL Pass-Through Facility كواحدة من أهم آليات تحسين الأداء. تتيح هذه التقنية إرسال استعلام SQL المحتوي على عبارة CASE مباشرة إلى محرك قاعدة البيانات المصدرية ليتم تنفيذه محلياً على الخادم البعيد.

تكمن الميزة الاستراتيجية لهذا النهج في استغلال القدرات الحسابية الهائلة لخوادم قواعد البيانات، وتنفيذ عمليات التصنيف والفلترة والتجميع قبل نقل البيانات. ينتج عن ذلك تقليص هائل في حجم البيانات المنقولة عبر الشبكة إلى جلسة SAS المحلية، حيث تصل النتائج جاهزة ومختصرة، مما يوفر ساعات من زمن النقل والمعالجة.

لضمان نجاح التمرير المباشر، يجب التأكد من استخدام صيغ SQL القياسية المتوافقة مع محرك قاعدة البيانات المستهدفة، وتجنب استخدام دوال SAS الحصرية غير المدعومة داخل نص الاستعلام الممرر مباشرة (Explicit Pass-Through).

11. الأخطاء الشائعة واستراتيجيات استكشاف الأخطاء وإصلاحها (Troubleshooting)

11.1 أخطاء عدم تطابق أنواع البيانات (Data Type Mismatch)

يعد خطأ عدم تطابق أنواع البيانات (Data Type Mismatch) من أكثر الأخطاء الشائعة التي يقع فيها المبرمجون عند كتابة عبارة CASE. يحدث هذا الخطأ عندما يعيد أحد فروع THEN قيمة نصية بينما يعيد فرع آخر أو فرع ELSE قيمة رقمية، مثل كتابة: when Points > 20 then 'Pass' else 0 end.

عند محاولة تشغيل هذا الكود، سيقوم مترجم SAS بإيقاف التنفيذ فوراً وإصدار رسالة خطأ واضحة في سجل النظام (SAS Log) تفيد بتعارض الأنواع البرمجية (Result of WHEN clause is not compatible with previous branches). لا تقبل لغة SAS التحويل التلقائي الضمني بين النصوص والأرقام داخل تعبير CASE لضمان دقة البيانات.

لحل هذه المشكلة وتصحيحها، يجب استخدام دوال التحويل الصريح؛ مثل استخدام دالة PUT() لتحويل القيم الرقمية إلى سلاسل نصية منسقة، أو دالة INPUT() لتحويل السلاسل النصية إلى قيم رقمية، بما يضمن تطابقاً تاماً في نوع البيانات المرجعة عبر كافة فروع العبارة الشرطية دون استثناء.

11.2 نسيان الكلمات المفتاحية الأساسية ومشاكل البنية

تتطلب البنية النحوية الصارمة لـ SQL الانتباه الكامل للكلمات المفتاحية وعلامات الترقيم. من الأخطاء الهيكلية الشائعة نسيان الكلمة المفتاحية الإلزامية END، وهو ما يؤدي إلى فشل المترجم في التعرف على نهاية التعبير الشرطي وظهور أخطاء نحوية معقدة في السجل تشير إلى وجود رمز غير متوقع (Syntax error: expecting END).

خطأ شائع آخر هو وضع فواصل عادية (Commas) بين عبارات WHEN المتعاقبة. لا يجوز استخدام الفواصل داخل بنية عبارة CASE نفسها، بل تُستخدم الفاصلة فقط في جملة SELECT للفصل بين الأعمدة والتعبيرات المختلفة بعد اكتمال عبارة CASE بالكامل وتسميتها.

كذلك يجب تجنب الخلط بين استخدام الفاصلة المنقوطة (Semicolon) داخل نص الاستعلام ونهايته؛ حيث لا توضع الفاصلة المنقوطة إلا في نهاية تعليمة SELECT ككل، وليس بعد كل فرع شرطي. إن مراقبة تلوين الكلمات في واجهات التطوير الحديثة مثل SAS Enterprise Guide أو SAS Studio يساعد كثيراً في اكتشاف هذه الأخطاء البصرية مبكراً.

11.3 الأخطاء المنطقية وتداخل الشروط غير المقصود

تعتبر الأخطاء المنطقية (Logical Errors) أشد خطورة من الأخطاء النحوية لأنها لا تمنع تنفيذ البرنامج ولا تطلق أي رسائل تحذيرية في سجل النظام، ولكنها تؤدي إلى توليد بيانات غير صحيحة تؤثر سلباً على سلامة القرارات المستندة إليها. ينشأ أغلب هذه الأخطاء نتيجة سوء ترتيب الشروط والتداخل المنطقي بين الفئات.

على سبيل المثال، عند تصنيف الأعمار: إذا تم وضع الشرط when Age >= 18 then 'Adult' قبل الشرط when Age >= 60 then 'Senior'، فإن جميع الأفراد الذين تبلغ أعمارهم 60 عاماً فما فوق سيتم تصنيفهم كـ ‘Adult’ ولن يصلوا أبداً إلى شرط ‘Senior’؛ لأن الشرط الأول يتحقق فيهم ويوقف التقييم التسلسلي فوراً.

لتشخيص واكتشاف هذه الأخطاء المنطقية الخفية، يُنصح دائماً بإجراء تدقيق تقاطعي (Cross-tabulation Validation) باستخدام إجراء PROC FREQ، لمقارنة المتغير المشتق الجديد بالمتغير الأصلي عبر جدول تقاطعي يوضح توزيع السجلات، والتأكد من وقوع كل قيمة في نطاقها الصحيح المتوقع منطقياً.

12. سيناريوهات وتطبيقات متقدمة في بيئات العمل الحقيقية

12.1 العبارات المتداخلة (Nested CASE Statements)

في الهياكل البيانية المتقدمة، قد تتطلب قواعد العمل تصنيفاً هرمياً متعدد الطبقات لا يمكن صياغته بسهولة عبر شروط مسطحة مفردة. تتيح SAS إمكانية كتابة عبارات CASE متداخلة (Nested CASE Statements)، حيث تتضمن عبارة THEN أو ELSE داخلها عبارة CASE ثانوية كاملة ومستقلة بأركانها.

تستخدم هذه الهيكلية في تصنيف العملاء بناءً على تقسيم جغرافي رئيسي يليه تصنيف تفصيلي للقيمة المالية لكل منطقة. يوضح الكود التالي نموذجاً للتعشيش الهرمي:


proc sql;
  select Team, Points, Rebounds,
         case
           when Team in ('A', 'B', 'C') then
             case
               when Points >= 25 then 'East - Gold'
               else 'East - Silver'
             end
           else
             case
               when Points >= 20 then 'West - Gold'
               else 'West - Silver'
             end
         end as Regional_Tier
  from original_data;
quit;

على الرغم من القوة التي يوفرها التعشيش، يجب استخدامه بحكمة واعتدال مع الالتزام التام بالمسافات البادئة؛ حيث إن الإفراط في التعشيش لمستويات متعددة يجعل الكود شديد التعقيد وصعب المراجعة والتعديل في المستقبل.

12.2 التحديث الشرطي المباشر للبيانات (Conditional UPDATE)

لا يقتصر استخدام عبارة CASE على استعلامات الاسترجاع والإنشاء (SELECT & CREATE TABLE)، بل تمثل أداة جوهرية لتعديل وتحديث البيانات القائمة مكانياً (In-Place Update) باستخدام تعليمة UPDATE داخل PROC SQL، دون الحاجة إلى إنشاء نسخ مكررة من الجداول الضخمة.

يتيح هذا النمط تحديث قيم متغير قائم بناءً على شروط معقدة في خطوة تشغيلية موحدة وسريعة، كما يظهر في الكود التالي لتعديل قيم النقاط للفرق بناءً على معايير تشجيعية:


proc sql;
  update original_data
    set Points = case
                   when Team = 'A' then Points + 5
                   when Team = 'D' then Points + 3
                   else Points
                 end;
quit;

تنبيه مهني: نظراً لأن تعليمة UPDATE تقوم بتعديل البيانات الأصلية المخزنة على القرص مباشرة وبصورة دائمة، يجب دائماً أخذ نسخة احتياطية من مجموعة البيانات قبل تنفيذ هذه العمليات للتأكد من إمكانية استرجاع البيانات في حال حدوث أي خطأ غير مقصود في الشروط المنطقية.

12.3 التكامل مع لغة الماكرو في SAS (SAS Macro Facility)

يمثل دمج عبارة CASE مع لغة الماكرو في SAS (SAS Macro Language) قمة المرونة والأتمتة في بناء خطوط معالجة البيانات التحليلية؛ حيث يمكن توليد شروط WHEN وفروع التصنيف ديناميكياً بناءً على معلمات إدخال متغيرة أو بيانات مستخرجة في زمن التشغيل الفعلي.

يمكن على سبيل المثال كتابة ماكرو يقبل قائمة متغيرة من العتبات الرقمية وأسماء التصنيفات، ويقوم بإنشاء كود SQL وتكرار عبارات WHEN آلياً باستخدام حلقات %DO الماكروية، مما يلغي الحاجة إلى تعديل الكود يدوياً عند تغير متطلبات التحليل أو الفترات الزمنية.

يضمن هذا التكامل بناء برمجيات استعلامية قابلة لإعادة الاستخدام (Reusable Modular Code) عبر مختلف المشاريع في المؤسسة، مما يوفر الجهد البرمجي، ويعزز استقرار المعايير التحليلية، ويسرع من وتيرة تسليم المشروعات الإحصائية بكفاءة متناهية.

الخاتمة

تُعد عبارة CASE WHEN في SAS PROC SQL ركيزة برمجية وتحليلية استثنائية تجمع بين المعايير العالمية للغة الاستعلامات البنيوية والقوة الإحصائية الفائقة لبيئة SAS. من خلال قدرتها على التكيف مع الشروط البسيطة، والبحث المركب، والتعشيش الهرمي، والعمليات التجميعية المشروطة، توفر هذه العبارة للمحللين وسيلة معيارية أنيقة لإدارة وتنقية وهيكلة البيانات بكفاءة عالية وبأقل استهلاك ممكن لموارد النظام.

إن الاستخدام الاحترافي لهذه الأداة يتطلب فهماً عميقاً لآليات التقييم التسلسلي، وضبطاً دقيقاً لأطوال المتغيرات لتجنب اقتطاع النصوص، وتعاملاً استباقياً صارماً مع خصوصية القيم المفقودة وفرع ELSE الافتراضي لضمان خلو المخرجات من أي تشوهات إحصائية. يمثل هذا الفهم الفارق الحقيقي بين البرمجة الروتينية والبرمجة التحليلية المتقدمة القادرة على دعم عمليات اتخاذ القرار بدقة وثقة.

مع استمرار تطور بيئات البيانات الضخمة واعتماد المعالجة الموزعة، يظل إتقان عبارة CASE في SQL مهارة أساسية ومستدامة تمكن المتخصصين من بناء استعلامات مرنة وقابلة للتوسع والنقل بين مختلف منصات التخزين وقواعد البيانات الحديثة، مما يجعلها استثماراً معرفياً لا غنى عنه لكل ممارس في مجالات الإحصاء وعلوم البيانات.

References

  • SAS Institute Inc. (2020). SAS(R) 9.4 SQL Procedure User’s Guide, Fourth Edition. Cary, NC: SAS Institute Inc. https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/sqlproc/titlepage.htm
  • Carpenter, A. (2013). Carpenter’s Complete Guide to the SAS REPORT Procedure. SAS Institute.
  • Cody, R. (2018). Learning SAS by Example: A Programmer’s Guide, Second Edition. Cary, NC: SAS Institute Inc.
  • Lafler, K. P. (2019). PROC SQL: Beyond the Basics Using SAS, Third Edition. Cary, NC: SAS Institute Inc.
  • ANSI/ISO/IEC. (2016). Information technology — Database languages — SQL — Part 2: Foundation (SQL/Foundation). ISO/IEC 9075-2:2016. https://webstore.ansi.org/
  • Burlew, M. M. (2014). SAS Macro Programming Made Easy, Third Edition. Cary, NC: SAS Institute Inc.
  • Delwiche, L. D., & Slaughter, S. J. (2019). The Little SAS Book: A Primer, Sixth Edition. Cary, NC: SAS Institute Inc.

اقتباس هذا المقال

looti, M. (2026, أغسطس 30). كيفية استخدام عبارة CASE WHEN في SAS (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-use-case-when-in-sas-with-examples/
looti, Mohammed. “كيفية استخدام عبارة CASE WHEN في SAS (مع أمثلة).” عرب سايكلوجي, 30 أغسطس 2026, https://arabpsychology.com/statistics/how-to-use-case-when-in-sas-with-examples/.
looti, Mohammed. “كيفية استخدام عبارة CASE WHEN في SAS (مع أمثلة).” عرب سايكلوجي. أغسطس 30, 2026. https://arabpsychology.com/statistics/how-to-use-case-when-in-sas-with-examples/.