2012-10-16 36 views
5

मेरे पास निम्नलिखित संरचना है:एसक्यूएल: एक मान का योग लेकिन केवल अलग आईडी के लिए - सशर्त राशि?

टाइप 1 और टाइप 2 की कई घटनाओं के साथ दिन, जहां टाइप 1 और टाइप 2 में उनके संबंधित दिनों में विदेशी कुंजी होती है। टाइप 2 में भी अवधि है।

अब मैं सभी टाइप 1 घटनाओं, सभी टाइप 2 घटनाओं और टाइप 2 अवधि के योग को गिनना चाहता हूं।

उदाहरण डेटा:

दिन:

ID = 1 | Date = yesterday | ... 

Typ1:

ID = 1 | FK_DAY = 1 | ... 

ID = 2 | FK_DAY = 1 | ... 

Typ2:

ID = 1 | FK_DAY = 1 | duration = 10 

ID = 2 | FK_DAY = 1 | duration = 20 

मैं अब परिणाम हैं:

Day.ID = 1 | countTyp1 = 2 | countTyp2 = 2 | sumDurationTyp2 = 30 

मेरी समस्या योग है, मुझे "विशिष्ट टाइप 2.आईडी के लिए योग" की आवश्यकता है ... क्या किसी को इसे हल करने का कोई तरीका पता है?

मैं निम्नलिखित की तरह कुछ का उपयोग कर रहा है, लेकिन निश्चित रूप से इस तरह मैं चाहता हूँ काम नहीं करता:

SELECT day.id, 
    count(DISTINCT typ1.id), 
    count(DISTINCT typ2.id), 
    sum(duration) AS duration 
FROM days 
    LEFT JOIN typ 
      ON day.id = typ1.id 
    LEFT JOIN typ2 
      ON day.id = typ2.id 
GROUP BY day.id; 
+0

आरडीबीएमएस और क्या संस्करण? – Tobsey

उत्तर

13

इस मेरे सामान्य दृष्टिकोण पूर्व-समेकित प्रत्येक मेज पर है, शामिल होने से पहले ।

आंशिक रूप से क्योंकि आप वास्तव में अलग-अलग मानों को नहीं जोड़ रहे हैं (यदि दो पंक्तियों में से प्रत्येक 10 था, तो उत्तर अभी भी 20 है)।

लेकिन अधिकतर क्योंकि यह वास्तव में इस तरह से सरल है। उप-प्रश्न एकत्रीकरण करते हैं, फिर जॉइन सभी 1: 1 होते हैं।

SELECT 
    days.id, 
    typ_agg.rows, 
    type2_agg.rows, 
    type2_agg.duration 
FROM 
    days 
LEFT JOIN 
    (SELECT fk_day, COUNT(*) as rows FROM typ GROUP BY fk_day) AS typ_agg 
    ON days.id = typ_agg.fk_day 
LEFT JOIN 
    (SELECT fk_day, COUNT(*) as rows, SUM(duration) as duration FROM typ2 GROUP BY fk_day) AS typ2_agg 
    ON days.id = typ2_agg.fk_day 
+1

। । मुझे उम्मीद है कि यह स्वीकार्य उत्तर है, क्योंकि यह सही दृष्टिकोण है। –

+0

बहुत धन्यवाद, मेरी वास्तविक क्वेरी में जो अधिक जटिल है, जो वास्तव में इसे और अधिक पठनीय बनाता है – prom85

0
SELECT day.id, 
    count(DISTINCT typ1.id), 
    count(DISTINCT typ2.id), 
    (select sum(t2.duration) 
    from typ2 t2 
    where t2.id = day.id 
    ) AS duration 
FROM days 
    LEFT JOIN typ 
      ON day.id = typ1.id 
    LEFT JOIN typ2 
      ON day.id = typ2.id 
GROUP BY day.id; 
+0

यह अतिरिक्त उपक्विरी पेश करता है, और मेरा मानना ​​है कि ओपी एक प्रश्न समाधान की तलाश में था। क्या आपके उत्तर का मतलब यह है कि इसे एक प्रश्न के रूप में नहीं लिखा जा सकता है? – Yuck

+0

@Yuck - यह कहां कहता है 'एकल क्वेरी' या 'कोई सब-क्वेरी' नहीं। आप 'उप-क्वेरी 'को' एकल क्वेरी 'का हिस्सा क्यों नहीं मानते? * (यदि वे किसी चीज़ का 'उप-' हैं, तो वे इसका एक हिस्सा हैं, और 'यह' एक ही प्रश्न है ...) * उल्लेख नहीं है कि कुछ आरडीबीएमएस उप-प्रश्नों का विस्तार करने के लिए असाधारण हैं। – MatBailie

+0

एफडब्ल्यूआईडब्ल्यू जो मेरा डाउनवोट नहीं है। और कम से कम SQL सर्वर में, इस प्रकार की क्वेरी (अक्सर) गंभीर प्रदर्शन दंड है। ऐसा नहीं है कि यह गलत है। मैं सिर्फ सवाल पूछ रहा था - क्या इसमें शामिल टेबलों को उप-चयन किए बिना ऐसा करने का कोई तरीका है? – Yuck