أساسيات خادم SQL: استخدام عبارة SQL GROUP BY

لغة استعلامات 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;

هذا يعود في الأساس بقائمة من جميع معرفات المنتج التي تم طلبها، كما يمكنك رؤيته في الشكل التالي.

We get a list of all of the ProductIDs that have been ordered (Image credit: Petri/Michael Otey)

استخدام 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(*).

Using SQL GROUP BY with aggregate functions (Image credit: Petri/Michael Otey)

استخدام 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.

Using SQL GROUP BY with multiple columns (Image credit: Petri/Michael Otey)

استخدام 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 دولار.

يمكنك رؤية نتائج هذا الكود في الشكل التالي:

Using SQL GROUP BY with the HAVING clause (Image credit: Petri/Michael Otey)

استخدام شرط 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 دولار بترتيب تنازلي، حيث يكون للعملاء الذين لديهم الطلبات الأكبر في الأعلى.

Using SQL GROUP BY with the ORDER BY clause (Image credit: Petri/Michael Otey)

كما ترون، يمكنك القيام بأشياء كثيرة باستخدام تعليمة SQL GROUP BY. أظهرت لك كيف يمكن استخدام تعليمة GROUP BY مع عدة أعمدة، فضلاً عن كيفية إضافة تعليمتي HAVING و ORDER BY لتصفية وفرز النتائج.

كالعادة، لا تتردد في طرح أي أسئلة حول تعليمة SQL GROUP BY. وإذا كنت ترغب في معرفة المزيد عن خادم SQL، فلا تتردد في الاطلاع على المقالات السابقة في سلسلة أساسيات خادم SQL.

Source:
https://petri.com/sql-group-by/