2009-08-15 16 views
5

मैं एसक्यूएल में भयानक हूं। मुझे नहीं पता कि मैं क्या करने की कोशिश कर रहा हूं, संभव है। लेकिन, हमारी डेटा संरचना के कारण, मुझे इस समस्या को इस तरह हल करने या बड़े वास्तुशिल्प परिवर्तन करने की आवश्यकता है।एसक्यूएल - बाएं बाहरी जॉइन और जहां खंड

मैं एक देश के लिए 'प्रांत' (ए.के.ए. राज्य) की संख्या गिनने की कोशिश कर रहा हूं। हालांकि, कुछ ऐसे प्रांत हैं जिन्हें गिनती से अनदेखा करने की आवश्यकता है। इस वजह से, मैं प्रत्येक देश में प्रांतों की गिनती के साथ देशों की एक सूची पुनर्प्राप्त करने की कोशिश कर रहा हूं।

उदाहरण के तौर पर, मुझे संयुक्त राज्य अमेरिका के लिए पूछताछ करने की आवश्यकता है, और 'वाशिंगटन डी.सी.' को अनदेखा करना है। गिनती से इसका कारण यह है कि हमारी आवश्यकताओं के अनुसार, वाशिंगटन डी.सी. एक राज्य नहीं है।

SELECT 
    c.Name AS 'CountryName', 
    ISNULL(COUNT(p.[ID]), 0) as 'ProvinceCount' 
FROM 
    Country c LEFT OUTER JOIN [Province] p ON p.[CountryID]=c.[ID] 
WHERE 
    c.[ID][email protected] and 
    p.[Name] <> 'Washington D.C.' 

आप कल्पना कर सकते हैं, यह प्रश्न जब idParameter संयुक्त राज्य अमेरिका से मेल खाता है कोई फल प्राप्त नहीं करता है: यहाँ है कि मैं क्या (यह काम नहीं करता) पल में कोशिश कर रहा हूँ है।

अपवादों में लगते समय मुझे सही गिनती कैसे मिलती है? आपकी मदद के लिए बहुत बहुत शुक्रिया।

उत्तर

9

आप एक उचित संख्या प्राप्त करने के लिए एक GROUP BY खंड की जरूरत है, और आप एक बाहरी कोई वैध प्रांतों के साथ उन देशों के लिए '0' मूल्यों को प्रदर्शित करने में शामिल होने की जरूरत है।

select 
    c.Name as 'CountryName', 
    isnull(count(c.Name), 0) as 'ProvinceCount' 
from 
    Country c 
left outer join 
    Province p on 
    p.CountryID = c.[ID] 
where 
    c.[ID] = @idParameter 
    and p.[Name] not in ('Washington D.C', 'Another State') 
group by 
    c.Name 
+0

हां। आप सही हे। उफ़। –

-2
select 
    c.name as 'country name' 
    isnull(count(p.[ID]), 0) as 'provice count' 
from 
    Country c 
inner join 
    Province p on 
    p.CountryID = c.[ID] 
where 
    c.[ID] = @idParameter 
    and 
    p.[Name] not in ('Washington D.C', 'Another State') 

शायद? टेस्ट नहीं हुआ।

-

इसे अस्वीकार करें; जैसा कि उपरोक्त पोस्टर द्वारा सुझाए गए अनुसार काम करने के लिए 'समूह द्वारा' की आवश्यकता होती है।

0

क्या आप इसे आज़मा सकते हैं?

SELECT 
    c.Name AS 'CountryName', 
    ISNULL(COUNT(*), 0) as 'ProvinceCount' 
FROM 
    Country c LEFT OUTER JOIN Province p ON p.CountryID=c.ID and p.Name <> 'Washington D.C.' 
WHERE 
    [email protected] 
GROUP BY c.Name 
3

आप टेक्स्ट को सूचीबद्ध नहीं करना चाहते हैं, एक टाइपो बग को देखने में कठिनाई का कारण बन सकता है। आप अंततः इसे बनाना चाहते हैं ताकि उपयोगकर्ता इसे स्वयं बनाए रखने के लिए एक पृष्ठ प्राप्त कर सके। तो:

ALTER TABLE Province 
ADD IsState bit 
GO 

UPDATE Province 
set IsState = 1 
where Name not in ('Washington D.C', 'Another State') 
GO 

UPDATE Province 
SET IsState = 0 
WHERE IsState IS NULL 
GO 

-- double check the data at this point by browsing it... 

SELECT c.name AS 'country name', 
isnull(count(1), 0) AS 'provice count' 
FROM Country c 
INNER JOIN Province p 
ON p.CountryID = c.[ID] 
WHERE c.[ID] = @idParameter 
AND p.IsState = 1 
GROUP BY c.name 
ORDER BY 1 
GO 
संबंधित मुद्दे