التجميع والترتيب في SQL


يا هلا! اليوم بنتكلم عن شغلتين أساسيتين ومهمتين جداً في SQL: التجميع (Aggregation) والترتيب (Ordering). كيف تقدر تلخص بياناتك وترتبها عشان تطلع بمعلومات مفيدة؟ هذا اللي بنعرفه.

التجميع (Aggregation) مع GROUP BY

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

نستخدم جملة GROUP BY عشان نجمع الصفوف اللي ليها نفس القيمة في عمود معين، وبعدين نطبق عليها دوال التجميع (Aggregate Functions).

دوال التجميع الأساسية:

  • COUNT(): يحسب عدد الصفوف أو القيم.
  • SUM(): يحسب مجموع القيم الرقمية.
  • AVG(): يحسب متوسط القيم الرقمية.
  • MAX(): يجيب أكبر قيمة.
  • MIN(): يجيب أقل قيمة.

مثال 1: عدد الموظفين في كل قسم

لو عندنا جدول Employees فيه DepartmentID و EmployeeName:

SELECT DepartmentID, COUNT(EmployeeID) AS NumberOfEmployees
FROM Employees
GROUP BY DepartmentID;

هنا، بنجمع كل الموظفين اللي لهم نفس DepartmentID، وبعدين نحسب عددهم.

مثال 2: مجموع المبيعات لكل منتج

لو عندنا جدول Orders فيه ProductID و Quantity و UnitPrice:

SELECT ProductID, SUM(Quantity * UnitPrice) AS TotalSales
FROM Orders
GROUP BY ProductID;

هنا جمعنا المبيعات لكل منتج.

ملاحظة سريعة: أي عمود تختاره في SELECT وما هو دالة تجميع، لازم يكون موجود في جملة GROUP BY. هذا قانون ثابت!

تصفية المجموعات باستخدام HAVING

بعد ما تجمع البيانات بـ GROUP BY، ممكن تحتاج تصفي المجموعات هذي بناءً على شروط معينة. هنا يجي دور HAVING.

تخيل إنك تبغى تشوف الأقسام اللي عدد موظفيها أكثر من 5. هنا ما تقدر تستخدم WHERE لأن WHERE تصفي الصفوف قبل التجميع، أما HAVING تصفي المجموعات بعد التجميع.

مثال: الأقسام اللي فيها أكثر من 5 موظفين

SELECT DepartmentID, COUNT(EmployeeID) AS NumberOfEmployees
FROM Employees
GROUP BY DepartmentID
HAVING COUNT(EmployeeID) > 5;

الترتيب (Ordering) مع ORDER BY

بعد ما تطلع بياناتك، غالباً تحتاج ترتبها عشان تصير أسهل للقراءة والتحليل. هنا نستخدم ORDER BY.

تقدر ترتب البيانات تصاعدياً (ASC - Default) أو تنازلياً (DESC).

مثال 1: ترتيب الموظفين حسب الاسم أبجدياً

SELECT EmployeeID, EmployeeName, Salary
FROM Employees
ORDER BY EmployeeName ASC; -- ASC اختيارية لأنها الافتراضي

مثال 2: ترتيب الموظفين حسب الراتب من الأعلى للأقل

SELECT EmployeeID, EmployeeName, Salary
FROM Employees
ORDER BY Salary DESC;

الترتيب على أكثر من عمود:

تقدر ترتب على عمودين أو أكثر. مثلاً، ترتب حسب القسم أولاً، وبعدين داخل كل قسم ترتب حسب الاسم.

SELECT EmployeeID, EmployeeName, DepartmentID, Salary
FROM Employees
ORDER BY DepartmentID ASC, EmployeeName ASC;

هنا، بيتم ترتيب البيانات أولاً بناءً على DepartmentID تصاعدياً، وإذا تساوت قيم DepartmentID في صفوف معينة، يتم ترتيبها بناءً على EmployeeName تصاعدياً.

تجميع وترتيب معاً: الصورة الكاملة

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

مثال: أعلى 3 أقسام من حيث إجمالي الرواتب

نحسب مجموع الرواتب لكل قسم، نصفي الأقسام اللي مجموع رواتبها أقل من قيمة معينة (مثلاً 100000)، وبعدين نرتبها تنازلياً وناخذ أعلى 3.

SELECT DepartmentID, SUM(Salary) AS TotalDepartmentSalary
FROM Employees
GROUP BY DepartmentID
HAVING SUM(Salary) > 100000 -- شرط اختياري لتصفية المجموعات
ORDER BY TotalDepartmentSalary DESC
LIMIT 3; -- أو TOP 3 في SQL Server

ملاحظة: LIMIT تستخدم في MySQL و PostgreSQL، بينما TOP تستخدم في SQL Server. اختر الأنسب لقاعدة بياناتك.

هذا كل شيء بخصوص التجميع والترتيب. تدرب عليهم كويس لأنهم من أهم الأدوات في جعبتك كمبرمج SQL!