سؤال
ويقول لدي جدولين:
وKnownHours:
ChargeNum CategoryID Month Hours 111111 1 2/1/09 10 111111 1 3/1/09 30 111111 1 4/1/09 50 222222 1 3/1/09 40 111111 2 4/1/09 50
وUnknownHours:
ChargeNum Month Hours 111111 2/1/09 70 111111 3/1/09 40.5 222222 7/1/09 25.5
وأحتاج إلى مجموعة هذه الساعات، وتجاهل شهر، في جدول بيانات واحدة بحيث نتيجتي المتوقعة هي التالية:
ChargeNum CategoryID Hours 111111 1 90 111111 2 50 111111 Unknown 110.5 222222 1 40 222222 Unknown 25.5
وأنا لا يمكن أن يبدو لهذا الرقم. أي مساعدة سيكون موضع تقدير كبير!
وتحرير: أنا بحاجة إلى مجموع الساعات لكل تركيبة ChargeNum / الفئة. لقد قمت بتحديث البيانات عينة لإظهار هذا.
المحلول
وستحتاج إلى استخدام UNION
الجمع بين نتائج دراستين استفسار. في الحالة الخاصة بك:
SELECT ChargeNum, CategoryID, SUM(Hours)
FROM KnownHours
GROUP BY ChargeNum, CategoryID
UNION ALL
SELECT ChargeNum, 'Unknown' AS CategoryID, SUM(Hours)
FROM UnknownHours
GROUP BY ChargeNum
ملحوظة - إذا كنت تستخدم UNION ALL
كما في أعلاه، فإنه ليس أبطأ من تشغيل الاستعلامات اثنين بشكل منفصل تماما كما هي لا مكررة تدقيق
نصائح أخرى
في الإخراج المتوقع، كنت قد حصلت على الثاني الصف الأخير مبلغ غير صحيح، ينبغي أن يكون 40 وفقا للبيانات في الجداول الخاصة بك، ولكن هنا هو الاستعلام:
Select ChargeNum, CategoryId, Sum(Hours)
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
وهنا هو الإخراج:
ChargeNum CategoryId
---------- ---------- ----------------------
111111 1 40
111111 2 50
111111 Unknown 70
222222 1 40
222222 Unknown 25.5
ويمكن أن نأخذ هذا خطوة أبعد ويقول أريد فقط أن نرى الصفوف عندما يقترن التي لديها 50 ساعة أو أكثر ... لقد حاولت ذلك، ولكن الحصول على خطأ أنه لا يمكن العثور SumHours ...
Select ChargeNum, CategoryId, Sum(Hours) As SumHours
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
WHERE (SumHours>=50)
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
وهكذا حاولت
Select ChargeNum, CategoryId, Sum(Hours) As SumHours
From (
Select ChargeNum, CategoryId, Hours
From KnownHours
Union
Select ChargeNum, 'Unknown' As CategoryId, Hours
From UnknownHours
) As a
WHERE (Hours>=50)
Group By ChargeNum, CategoryId
Order By ChargeNum, CategoryId
ولكن هذا لا يعطي مجموع ساعات على كلا الجدولين ...