لغة استعلامات T-SQL في خادم SQL لديها مجموعة واسعة من خيارات استرجاع البيانات. وهذا يشمل القدرة على استعلام قاعدة بيانات SQL، بالإضافة إلى توفير وظيفة مجموع، ووظيفة تجميع العد، وتجميع الأعمدة. يمكن أن تستفيد من فقرة SQL GROUP BY جميع هذه القدرات. في هذه المقالة، سأريك كيف يمكن استخدام فقرة GROUP BY بمفردها أو بالاشتراك مع واحدة من وظائف التجميع لإجراء الحسابات استنادًا إلى التجميع.
كيف تعمل فقرة SQL GROUP BY؟
تُستخدم فقرة SQL GROUP BY مع بيان SELECT لترتيب البيانات في مجموعات من البيانات المتطابقة. تتبع هذه الفقرة الفقرة WHERE في بيان SELECT.
غالبًا ما يتم استخدام هذه الفقرة مع وظائف التجميع مثل SUM، COUNT، AVG، MAX، أو MIN، التي تتيح لك إجراء الحسابات باستخدام البيانات المجمعة. يمكنك تجميع البيانات حسب أي نوع من أنواع الأعمدة المختلفة بما في ذلك الأرقام مثل معرفات المنتجات، أو التواريخ، أو الأحرف مثل الوصف.
بناء جملة GROUP BY الأساسية بسيط تمامًا:
SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1;
هنا، يمكنك رؤية جملة GROUP BY تستخدم مع جملة SELECT أساسية. تسترجع جملة SELECT عمودين، والعمود الثاني يستخدم وظيفة تجميع.
استخدام وظيفة التجميع ليس مطلوبًا تقنيًا، ولكنه إضافة شائعة جدًا لجملة GROUP BY. سيتم إجراء التجميع على البيانات الموجودة في العمود الأول.
لنقم بالتعمق أكثر ونرى جملة GROUP BY في العمل.
استخدام SQL GROUP BY مع جملة SELECT
أولاً، دعنا نلقي نظرة فقط على استخدام جملة SQL GROUP BY مع جملة SELECT بسيطة دون إضافة وظيفة تجميع. يسترجع القائمة التالية ويجمع عمود “معرف المنتج” من جدول SalesLT.SalesOrderDetail في قاعدة بيانات العينة AdventureWorksLT2019.
USE AdventureWorksLT2019; SELECT ProductID FROM SalesLT.SalesOrderDetail GROUP BY ProductID;
هذا يعود في الأساس بقائمة من جميع معرفات المنتج التي تم طلبها، كما يمكنك رؤيته في الشكل التالي.

استخدام SQL GROUP BY مع وظائف تجميعية
من الأكثر شيوعًا استخدام شرط GROUP BY في SQL مع واحدة من وظائف التجميع التي يمكن أن تعطيك عددًا، إجماليًا، متوسطًا، أو ملخصًا لجميع الأعمدة التي قمت بتجميعها معًا. تستخدم البيان التالي GROUP BY مع جدول SalesLT.Product من قاعدة بيانات AdventureWorksLT2019 للعثور على العدد الإجمالي للمنتجات في كل فئة منتجات:
USE AdventureWorksLT2019; SELECT ProductCategoryID, COUNT(*) AS TotalProducts FROM SalesLT.Product GROUP BY ProductCategoryID;
في هذا المثال، يُرجع البيان SELECT عمود ‘ProductCategoryID’ من جدول SalesLT.Product، ويحسب عدد المنتجات في كل فئة باستخدام وظيفة التجميع COUNT(*). هنا، يُقسم شرط GROUP BY النتائج حسب ‘ProductCategoryID’ بينما تحسب وظيفة العد COUNT العدد الإجمالي للمنتجات في كل فئة منتجات. تستخدم نتائج وظيفة COUNT(*) الاسم المستعار ‘TotalProducts’.
تُظهر نتائج هذا الاستعلام في الشكل التالي. يُظهر هذا الإخراج العدد الإجمالي للمنتجات في كل فئة منتجات، كما تم حسابه باستخدام شرط GROUP BY. يُرجع معلومات الملخص بواسطة وظيفة التجميع COUNT(*).

استخدام SQL GROUP BY مع عدة أعمدة
وظيفة SQL GROUP BY ليست محدودة بالعمل مع عمود واحد. يمكن استخدامها أيضًا مع عدة أعمدة بشكل متزامن في نفس الاستعلام.
لنلقِ نظرةً على مثال استخدام جملة GROUP BY مع عمودين من جدول SalesLT.Product في قاعدة بيانات AdventureWorksLT2019. تُظهر الاستعلام التالي كيفية استرجاع العدد الإجمالي للمنتجات لكل فئة منتج ونموذج منتج.
USE AdventureWorksLT2019; SELECT ProductCategoryID, ProductModelID, COUNT(*) AS TotalProducts FROM SalesLT.Product GROUP BY ProductCategoryID, ProductModelID;
هنا، يتم استرجاع عمودي ‘ProductCategoryID’ و ‘ProductModelID’ ونحن نستخدم وظيفة العدد الإجمالي COUNT(*) لعدد المنتجات في كل فئة وفئة فرعية. في هذا المثال، تقوم جملة GROUP BY بتجميع نتائج عمودي ‘ProductCategoryID’ و ‘ProductModelID’. يتم إنشاء مجموعتين متميزتين بناءً على العمودين المختلفين.
يمكنك رؤية نتائج هذا الاستعلام في الشكل التالي. تُظهر هذه النتائج العدد الإجمالي للمنتجات ونماذج المنتجات ويتم استرجاع العدد الإجمالي باستخدام الاسم المستعار للعمود TotalProducts.

استخدام SQL GROUP BY مع جملة HAVING
استخدام شائع آخر لجملة GROUP BY هو دمجها مع جملة HAVING. في الواقع، يمكنك استخدام جملة GROUP BY مع جملة HAVING لتصفية نتائج الاستعلام بناءً على الشروط التي تطبقها جملة HAVING على تجميع البيانات. يمكن تطبيق الشرط على عمود نوع بيانات عادي أو على وظيفة تجميع.
لنلق نظرة على مثال على استخدام شرط GROUP BY في SQL مع شرط HAVING مع قاعدة بيانات AdventureWorksLT2019. يوضح هذا المثال العملاء الذين قاموا بطلبات في جدول SalesLT.SalesOrderHeader بمبلغ طلب إجمالي أكبر من 2000 دولار. هنا، يتم استخدام شرط GROUP BY لتجميع الطلبات حسب العميل، ثم يقوم شرط HAVING بتصفية العملاء استنادًا إلى إجمالي مبلغ الطلب.
USE AdventureWorksLT2019; SELECT c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount FROM SalesLT.Customer c JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.FirstName, c.LastName HAVING SUM(soh.TotalDue) > 2000;
- في هذا الكود، يتم دمج جدول SalesLT.Customer مع جدول SalesLT.SalesOrderHeader على عمود ‘CustomerID’.
- قائمة الاختيار تسترجع ‘CustomerID’، ‘FirstName’، ‘LastName’، و ‘TotalOrderAmount’.
- يتم استخدام شرط GROUP BY لتجميع النتائج حسب العميل.
- وظيفة الجمع SUM() تقوم بحساب إجمالي مبلغ الطلب لكل عميل.
- يقوم شرط HAVING بتصفية النتائج المجمعة لاختيار العملاء الذين إجمالي مبلغ طلباتهم أكبر من 2000 دولار.
يمكنك رؤية نتائج هذا الكود في الشكل التالي:

استخدام شرط GROUP BY في SQL مع شرط ORDER BY
يمكنك أيضًا استخدام تعليمة SQL GROUP BY مع تعليمة ORDER BY لفرز مجموعة النتائج حسب عمود واحد أو أكثر. يستخدم المثال التالي قاعدة البيانات AdventureWorksLT2019. لتوضيح استخدام تعليمة ORDER BY مع تعليمة GROUP BY، يمكنك ببساطة أخذ كود المثال السابق وإضافة تعليمة ORDER BY لفرز النتائج التي تعرض مبالغ الطلب الأكبر تنازليًا.
USE AdventureWorksLT2019; SELECT c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount FROM SalesLT.Customer c JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.FirstName, c.LastName HAVING SUM(soh.TotalDue) > 2000 ORDER BY TotalOrderAmount DESC;
يمكنك رؤية النتائج في الشكل التالي. تظهر هذه النتائج قائمة العملاء الذين لديهم طلبات بأكثر من 2000 دولار بترتيب تنازلي، حيث يكون للعملاء الذين لديهم الطلبات الأكبر في الأعلى.

كما ترون، يمكنك القيام بأشياء كثيرة باستخدام تعليمة SQL GROUP BY. أظهرت لك كيف يمكن استخدام تعليمة GROUP BY مع عدة أعمدة، فضلاً عن كيفية إضافة تعليمتي HAVING و ORDER BY لتصفية وفرز النتائج.
كالعادة، لا تتردد في طرح أي أسئلة حول تعليمة SQL GROUP BY. وإذا كنت ترغب في معرفة المزيد عن خادم SQL، فلا تتردد في الاطلاع على المقالات السابقة في سلسلة أساسيات خادم SQL.
Source:
https://petri.com/sql-group-by/