2009-08-04 13 views
41

कहो के लिए दो तालिकाओं कम्बाइन मैं दो तालिकाओं है:एक उत्पादन

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 

मुझे यह पता लगाना प्रतीत नहीं होता है। किसी भी तरह की सहायता का स्वागत किया जाएगा!

संपादित करें: मुझे प्रत्येक चार्जनम/श्रेणी संयोजन के लिए घंटों की आवश्यकता है। मैंने इसे प्रतिबिंबित करने के लिए नमूना डेटा अपडेट किया।

उत्तर

65

आपको दो प्रश्नों के परिणामों को गठबंधन करने के लिए 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 का उपयोग करते हैं, यह दो प्रश्नों को अलग से चल रहा है के रूप में यह कोई डुप्लिकेट-चेकिंग की तुलना में कोई धीमी है।

+0

मैंने सुना है इस असाधारण धीमी है। ऐसा करने के लिए कोई और रास्ता नहीं है? –

+0

एकमात्र चीज जो संभवतः तेज़ी से होगी, डेटा को एक टेबल में स्टोर करना है, दो नहीं। अज्ञात घंटों के लिए 'Category आईडी = न्यूल 'का प्रयोग करें। –

+4

@ मैथ्यू: आपने यह कहां सुना? 'यूनियन ऑल' बिल्कुल तेज है। – Eric

11

अपने अपेक्षित आउटपुट में, आप दूसरे अंतिम पंक्ति योग गलत मिल गया है, यह आपके तालिकाओं में आंकड़ों के अनुसार 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 
+0

आपको बहुत धन्यवाद, मेरी समस्या को हल करने के लिए मुझे यही चाहिए! :) – Alexander

1

हम इससे भी एक कदम आगे ले सकते हैं और कहते हैं कि मैं केवल पंक्तियों देखना चाहते हैं जब संयुक्त 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 

की कोशिश की लेकिन यह दोनों टेबल पर घंटे की राशि दे रही है नहीं है ...

संबंधित मुद्दे