2009-05-20 13 views
8

मैं एक तालिका में रिकॉर्ड्स के कुल # और गिनती की कुल # गणना करना चाहता हूं जो कुछ शर्तों से मेल खाते हैं। मैं दो अलग-अलग क्वेरी के साथ इन कर सकते हैं:दो एसक्यूएल COUNT() प्रश्न?

SELECT COUNT(*) AS TotalCount FROM MyTable; 
SELECT COUNT(*) AS QualifiedCount FROM MyTable 
    {possible JOIN(s) as well e.g. JOIN MyOtherTable mot ON MyTable.id=mot.id} 
    WHERE {conditions}; 

वहाँ एक क्वेरी में इन गठबंधन करने के लिए इतना है कि मैं एक पंक्ति में दो क्षेत्रों पाने के लिए एक रास्ता है?

SELECT {something} AS TotalCount, 
    {something else} AS QualifiedCount 
    FROM MyTable {possible JOIN(s)} WHERE {some conditions} 

यदि नहीं, तो मैं दो प्रश्नों जारी कर सकते हैं और उन्हें एक सौदे में लपेट ताकि वे संगत कर रहे हैं, लेकिन मैं एक साथ यह करने के लिए उम्मीद कर रहा था।

संपादित करें: मैं परमाणुता के बारे में अधिक चिंतित हूं; यदि दो उप-चयन बयानों की आवश्यकता है तो यह तब तक ठीक है जब तक कोई आईएनएसईआरटी कहीं से आ रहा है, यह दो प्रतिक्रियाओं को असंगत नहीं बनाता है।

संपादित 2: CASE उत्तर उपयोगी हैं लेकिन मेरे विशिष्ट उदाहरण में, शर्तों में एक और तालिका के साथ जॉइन शामिल हो सकता है (उल्लेख करने के लिए भूल गया कि मेरी मूल पोस्ट में, क्षमा करें) तो मुझे लगता है कि यह दृष्टिकोण काम नहीं करेगा ।

+0

आप किस प्रकार का डेटाबेस उपयोग कर रहे हैं? – Andomar

+0

MySQL लेकिन मैं इसे सामान्य रूप से जानना चाहता हूं अगर यह बहुत सरल है –

+0

संबंधित लेकिन समाधान के लिए नहीं: आप बड़ी टेबल के लिए गणना प्राप्त करने के लिए भी उपयोग कर सकते हैं। SQLTALC_FOUND_ROWSFROM MyTable चुनें; चुनें FOUND_ROWS(); SQLTALC_FOUND_ROWSFROM MyTable जहां {शर्तों} चुनें; चुनें FOUND_ROWS(); –

उत्तर

22

एक तरह से अपने ही विरुद्ध तालिका में शामिल होने के लिए है:

select 
    (select count(*) from Mytable) as TotalCount, 
    (select count(*) from Mytable where {some conditions}) as QualifiedCount 

या आप एक मामले में स्थिति डाल सकते हैं:

select 
    count(*) as TotalCount, 
    sum(case when {some conditions} then 1 else 0 end) as QualifiedCount 
from 
    MyTable 

select 
    count(*) as TotalCount, 
    count(s.id) as QualifiedCount 
from 
    MyTable a 
left join 
    MyTable s on s.id = a.id and {some conditions} 

एक और तरीका है सबक्वेरी उपयोग करने के लिए है

संबंधित:

SQL Combining several SELECT results

+0

स्व-जॉइन उस मामले को संभालता है जहां स्थितियों में अन्य शामिल होते हैं। –

19

Sql सर्वर या MySQL में, आप ऐसा कर सकते हैं एक मामला बयान के साथ:

select 
    count(*) as TotalCount, 
    sum(case when {conditions} then 1 else 0 end) as QualifiedCount 
from MyTable 

संपादित करें:

select 
    count(*) as TotalCount, 
    sum(case when {conditions} then 1 else 0 end) as QualifiedCount 
from MyTable t 
left join MyChair c on c.TableId = t.Id 
group by t.id, t.[othercolums] 

ग्रुप द्वारा: यह भी अगर आप हालत में एक में शामिल हों का उपयोग काम करता है यह सुनिश्चित करने के लिए है कि आपको मुख्य तालिका से केवल एक पंक्ति मिलती है।

+1

बस यह इंगित करना चाहते हैं कि यह उदाहरण किसी भी संघ से बेहतर प्रदर्शन करेगा या इसमें शामिल होगा क्योंकि इसे – kscott

+0

पर एक बार प्रश्न में तालिका का मूल्यांकन करना होगा, मुझे यह तकनीक पसंद है, यह सुरुचिपूर्ण है। –

+0

वह वाक्यविन्यास "उपनाम = अभिव्यक्ति" विशेष रूप से एसक्यूएलसेवर/माईएसक्यूएल है या यह काफी सामान्य है? –

7

अगर आप सिर्फ पंक्तियों गिनती कर रहे हैं तो आप सिर्फ नेस्टेड प्रश्नों का उपयोग कर सकते हैं।

select 
    (SELECT COUNT(*) AS TotalCount FROM MyTable) as a, 
    (SELECT COUNT(*) AS QualifiedCount FROM MyTable WHERE {conditions}) as b 
+0

मैं मानता हूं कि परिणाम प्राप्त करने का यह बेहतर तरीका है क्योंकि यह आपको चाहिए और इसे अलग-अलग निष्पादन के रूप में एक ही समय में आपको देना चाहिए। –

+0

यह क्वेरी आपको उत्तर देगी, लेकिन दो चुनिंदा वक्तव्यों की लागत और जहां क्लॉज सीएएसई समाधान को अधिक कुशल बनाता है – kscott

+0

+1 और फ़ॉर्मेटिंग के लिए संपादित, आशा है कि आपको कोई फर्क नहीं पड़ता! – Andomar

0

MySQL NULLs गिनती नहीं करता है, तो यह भी काम करना चाहिए:

SELECT count(*) AS TotalCount, 
    count(if(field = value, field, null)) AS QualifiedCount 
    FROM MyTable {possible JOIN(s)} WHERE {some conditions} 

कि अच्छी तरह से काम करता है अगर QuailifiedCount क्षेत्र एक वाम से आता है शामिल हों, और आप केवल परवाह अगर यह मौजूद है। उपयोगकर्ताओं की संख्या प्राप्त करने के लिए, और उनके पते में भरने वाले उपयोगकर्ताओं की संख्या:

SELECT count(user.id) as NumUsers, count(address.id) as NumAddresses 
    FROM Users 
    LEFT JOIN Address on User.address_id = Address.id; 
संबंधित मुद्दे