البرمجة

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

لحل هذه المشكلة، يجب عليك استخدام استعلام SQL يستخدم نوعين من الاستعلامات الفرعية (Subquery):

  1. الاستعلام الأول: لحساب الفواتير المجمعة بناءً على شروط معينة.
  2. الاستعلام الثاني: لتحديث رقم الفاتورة لكل فاتورة مجمعة.

هنا تجد الاستعلامات اللازمة:

sql
WITH GroupedInvoices AS ( SELECT *, SUM(totord) OVER (PARTITION BY ordnum, promdate ORDER BY line) AS RunningTotal, COUNT(DISTINCT invtid) OVER (PARTITION BY ordnum, promdate) AS DistinctInvtidCount, ROW_NUMBER() OVER (PARTITION BY ordnum, promdate ORDER BY line) AS RowNum FROM Invoices ), FilteredInvoices AS ( SELECT *, CASE WHEN RunningTotal >= 20000000 OR DistinctInvtidCount > 16 THEN 1 ELSE 0 END AS ShouldGroup FROM GroupedInvoices ), UpdatedInvoices AS ( SELECT *, SUM(ShouldGroup) OVER (ORDER BY ordnum, promdate, line) AS GroupNumber FROM FilteredInvoices ) UPDATE UpdatedInvoices SET invnum = GroupNumber

هذا الاستعلام يستخدم نافذة (window function) لحساب التراكم الجزئي للحقل totord لكل طلبية ordnum بترتيب الأسطر line، ويحسب أيضًا عدد الفواتير المختلفة invtid لكل طلبية.
ثم يستخدم CASE لتحديد ما إذا كان يجب تجميع الفاتورة أم لا بناءً على الشروط التي ذكرتها.
أخيرًا، يقوم الاستعلام بتحديث رقم الفاتورة invnum برقم الفاتورة المجمعة GroupNumber بناءً على الترتيب.

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

لحل المشكلة المذكورة، يتم استخدام الاستعلام الأول لحساب المبلغ التراكمي RunningTotal لكل طلبية ordnum مع الحفاظ على ترتيب الأسطر line، وكذلك عدد الفواتير المختلفة DistinctInvtidCount لكل طلبية.

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

أما الاستعلام الثالث، فيقوم بتحديث رقم الفاتورة invnum برقم الفاتورة المجمعة GroupNumber بناءً على الترتيب.

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