سؤال

لديّ جدولين AP و Inv حيث يوجد كلاهما الأعمدة [Project] و [Value].

أريد استعلام لإعادة شيء مثل هذا:

مشروع | sum_ap | sum_inv

لقد توصلت إلى الكود أدناه لكنها تعيد النتائج الخاطئة (المبلغ خاطئ).

SELECT AP.[PROJECT],
SUM(AP.Value) AS SUM_AP, 
SUM(INV.Value) AS SUM_INV
FROM AP INNER JOIN INV ON (AP.[PROJECT] =INV.[PROJECT])
WHERE AP.[PROJECT] = 'XXXXX'
GROUP BY AP.[PROJECT]
هل كانت مفيدة؟

المحلول

النتائج من استعلامك خاطئة لأن القيم التي تحاول تلخيصها يتم تجميعها ، مما يؤدي إلى تضمين القيم المكررة في SUM.

يمكنك حلها مع اثنين من الإجراءات الفرعية:

SELECT 
    AP1.[PROJECT],
    (SELECT SUM(AP2.Value) FROM AP AS AP2 WHERE AP2.PROJECT = AP1.PROJECT) AS SUM_AP,
    (SELECT SUM(INV2.Value) FROM INV AS INV2 WHERE INV2.PROJECT = AP1.PROJECT) AS SUM_INV
FROM AP AS AP1 
    INNER JOIN INV AS INV1 
        ON (AP1.[PROJECT] =INV1.[PROJECT])
WHERE AP1.[PROJECT] = 'XXXXX'
GROUP BY AP1.[PROJECT]

نصائح أخرى

اذا كنت تمتلك N صفوف في AP مع معرف مشروع معين ، و M الصفوف في inv مع هذا المعرف ، فإن الانضمام بين الجدولين في معرف المشروع سيكون مجموعها N*M الصفوف لهذا المشروع ، لأنه سيتم تكرار نفس الصف في AP لكل صف في Inv الذي يحتوي على معرف المشروع هذا ، والعكس صحيح. ولهذا السبب فإن تهمك هي على الأرجح (لأنها تحسب نفس الصف في جدول معين عدة مرات بسبب التكرار من Join).

بدلاً من ذلك ، قد ترغب في محاولة الانضمام بين نتائج اثنين من الفخذيين ، أحدهما يجمع الجدول الأول حسب معرف المشروع ويفعله في مجموعه ، والثاني الذي يجمع الجدول الآخر حسب معرف المشروع ويقوم بذلك - ثم الانضمام بمجرد أن يكون لديك صف واحد فقط مع SUM لكل معرف المشروع.

إذا كان المشروع هو الجدول الأصل ، فيجب عليك الاختيار من جدول المشروع ، والقيام بالانضمام الخارجي الأيسر على الجدولين للأطفال:

SELECT PROJECT.PROJECT_ID, SUM(AP.Value) AS SUM_AP, SUM(INV.Value) AS SUM_INV
FROM PROJECT
LEFT OUTER JOIN AP ON (AP.[PROJECT] = PROJECT.[PROJECT_ID])
LEFT OUTER JOIN INV ON (INV.[PROJECT] = PROJECT.[PROJECT_ID])
WHERE PROJECT.[PROJECT_ID] = 'XXXXX'
GROUP BY PROJECT.[PROJECT_ID]

يمكنك فصل الحسابات المبلغ. إحدى الطرق التي يمكنني التفكير بها هي نقل حساب المخزون إلى مسمة فرعية ، مثل:

SELECT 
    AP.[PROJECT]
,   SUM(AP.Value) AS SUM_AP
,   SummedInv as SUM_INV
FROM AP
LEFT JOIN (
    SELECT PROJECT, SUM(Value) AS SUM_INV
    FROM INV
    GROUP BY PROJECT
) SummedInv ON SummedInv.Project = AP.Project
GROUP BY AP.PROJECT, SummedInv.SUM_INV

بسبب ال SummedInv تم تجميع الاسم الفرعي على project, ، من الآمن التجميع SummedInv.SUM_INV في الاستعلام الخارجي كذلك.

ماذا عن هذا الاستعلام:

select SUM(gpCutBody.actualQty) as cutQty   , SUM(gpSewBody.quantity) as sewQty

from jobOrder
inner join gpCutHead on gpCutHead.joNum = jobOrder.joNum
inner join gpSewHead on gpSewHead.joNum = jobOrder.joNum

inner join gpCutBody on gpCutBody.gpCutID = gpCutHead.gpCutID
inner join gpSewBody on gpSewBody.gpSewID = gpSewHead.gpSewID


where jobOrder.joNum = '36'

هنا هو رابط ERD: http://dl.dropbox.com/u/18794525/aug٪207٪20dump٪20stan.png

محاولة:

SELECT AP.[PROJECT] AS PROJECT, SUM(AP.[Value]) AS SUM_AP, SUM(INV.[Value]) AS SUM_INV
FROM AP, INV
WHERE AP.[PROJECT] = INV.[PROJECT]
AND AP.[PROJECT] = 'XXXXX'
GROUP BY AP.[PROJECT]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top