لحل هذه المشكلة، يجب عليك استخدام استعلام SQL يستخدم نوعين من الاستعلامات الفرعية (Subquery):
- الاستعلام الأول: لحساب الفواتير المجمعة بناءً على شروط معينة.
- الاستعلام الثاني: لتحديث رقم الفاتورة لكل فاتورة مجمعة.
هنا تجد الاستعلامات اللازمة:
sqlWITH 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
بناءً على الترتيب.