البرمجة

كيفية استخدام SUM في SQL

عند استخدام أعمدة محسوبة في التجميع (Aggregate) مثلما تفعله في الاستعلام الخاص بك، يجب أن تأخذ في الاعتبار أن أسماء الأعمدة المحسوبة ليست متاحة مباشرةً في الجزء الخاص بالتجميع (الجزء الذي يحتوي على دالة التجميع مثل SUM). هذا يرجع إلى ترتيب تنفيذ الاستعلام في SQL حيث يتم تنفيذ الجزء الخاص بالتجميع (Aggregate) بعد الجزء الخاص بالتحديد والتصفية (Selection and Filtering).

بمعنى آخر، الأعمدة المحسوبة في الجزء الخاص بالتحديد (Selection) لا يمكن استخدامها مباشرة في دالة التجميع (Aggregate)، ولذلك يجب إعادة تعريف هذه الأعمدة في الجزء الخاص بالتجميع (Aggregate)، أو استخدام التعبيرات التي تم اشتقاقها في الجزء الخاص بالتحديد (Selection) مرة أخرى في الجزء الخاص بالتجميع (Aggregate).

في استعلامك، العمود T1 هو تعبير محسوب على الفور، ولكن لم يكن متاحًا لدالة التجميع SUM مباشرة. لحل هذه المشكلة، يمكنك إعادة استخدام التعبير الذي قمت بتحديده لحساب T1 في جزء الاختيار (Selection) مرة أخرى في الجزء الخاص بالتجميع (Aggregate)، أو استخدام التعبير نفسه مرة أخرى في الجزء الخاص بالتجميع.

وبناءً على الاستعلام الذي قدمته، يمكن تعديله ليصبح كالتالي:

sql
SELECT E.EMPNO, E.DEPTNO, E.SAL, E.COMM, COALESCE(SAL,0) + COALESCE(COMM,0) AS T1, CASE WHEN E.DEPTNO = 10 THEN COALESCE(E.SAL,0) + COALESCE(E.COMM,0) WHEN D.DNAME = 'ACCOUNTING' THEN COALESCE(E.SAL,0) - COALESCE(E.COMM,0) ELSE 0 END AS T FROM EMP E LEFT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;

ثم يمكنك استخدام هذا الاستعلام كجزء فرعي للحصول على المجموع:

sql
SELECT SUM(T1 + T) AS T2 FROM ( SELECT E.EMPNO, E.DEPTNO, E.SAL, E.COMM, COALESCE(SAL,0) + COALESCE(COMM,0) AS T1, CASE WHEN E.DEPTNO = 10 THEN COALESCE(E.SAL,0) + COALESCE(E.COMM,0) WHEN D.DNAME = 'ACCOUNTING' THEN COALESCE(E.SAL,0) - COALESCE(E.COMM,0) ELSE 0 END AS T FROM EMP E LEFT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ) subquery;

باستخدام هذا النهج، يتم استخدام التعبيرات T1 و T المحسوبة في الاستعلام الفرعي، ثم يتم تجميع النتائج في الاستعلام الرئيسي للحصول على النتيجة النهائية.

المزيد من المعلومات

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

بالنسبة للجزء الأول من الاستعلام، فإنه يقوم بتحديد الأعمدة الأساسية التي يتم استخدامها في الاستعلام وتعريف تعابير محسوبة لحساب القيم T1 و T. يتم استخدام دالة COALESCE للتحقق من وجود قيم صالحة للحساب، وذلك لتجنب القيم الفارغة.

بعد ذلك، يتم استخدام جملة CASE لتحديد القيم المطلوبة للعمود T بناءً على شروط معينة، مثل قيمة DEPTNO أو اسم القسم (DNAME).

المشكلة التي واجهتها المشكلة الرئيسية كانت في الجزء الثاني من الاستعلام، حيث حاولت استخدام أعمدة محسوبة (T1 و T) مباشرة في دالة التجميع SUM. ومن هنا جاءت رسالة الخطأ “invalid identifier” التي تشير إلى عدم وجود تعريف صحيح للعمود.

لحل هذه المشكلة، تم إنشاء استعلام فرعي يحتوي على نفس التعابير المحسوبة (T1 و T)، ومن ثم تم استخدام دالة التجميع SUM لحساب القيمة الإجمالية لتلك التعابير في الجزء الرئيسي من الاستعلام.

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

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

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

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