2011-06-10 19 views
6

इस सवाल का खातिर शामिल करके, चलो इस तालिका संरचना लगता है जाने उन स्थानों को छोड़ देगा जिनके पास वहां रहने वाले लोग नहीं हैं। क्या इसके बजाय 0 को गिनने का कोई तरीका है?एसक्यूएल समूह खाली पंक्तियों

(मैं SQL सर्वर 2005 लक्ष्यीकरण रहा हूँ, बंद मौका है कि यह मायने रखती में)

संपादित करें: यहाँ मेरी असली (अनाम बनाया) क्वेरी है, स्टीव समाधान अनुकूल करने के लिए कोशिश कर के बाद:

SELECT 
    ft.FooTypeID, COUNT(f.FooID) 
FROM FooType as ft 
LEFT OUTER JOIN Foo f ON ft.FooTypeID = f.FooTypeID 
LEFT JOIN FooConfig fc ON ft.NotificationConfigID = fc.FooConfigID 
WHERE 
    DateDiff(day, GetDate(), f.Date) > 0 AND 
    DateDiff(day, GetDate(), f.Date) < fc.Days 
GROUP BY ft.FooTypeID 

(मेरे प्रारंभिक उदाहरण के बीच अनुवाद है और यह है: Foo -> लोग, FooType -> Places, FooConfig -> अतिरिक्त मज़े के लिए एक तीसरी तालिका) मैं यह काम फॉस्को के समाधान के साथ कर सकता हूं, लेकिन मैं स्टीव को पसंद करूंगा।

+0

क्या मूल्य तुम 'FooConfig' मेज से पुनः प्राप्त करना चाहते हैं? ऐसा लगता है कि आप इसके साथ कुछ भी नहीं कर रहे हैं। –

+0

'fc.Days', 'WHERE' खंड –

+0

में उपयोग किया गया ओह हाँ - क्षमा करें! यह एक लंबा दिन रहा है –

उत्तर

3
SELECT pla.PlaceID, COUNT(peo.PersonID) 
FROM Places AS pla LEFT OUTER JOIN People as peo ON peo.PlaceID = pla.PlaceID 
GROUP BY pla.PlaceID 

संपादित प्रश्न:

मान लिया जाये कि वहाँ हमेशा एक FooConfig प्रविष्टि, हम (कि मेज पर LEFT JOIN छोड़ देंगे यह 'के रूप में हमेशा वहाँ रहेंगे)। हम तो अतिरिक्त मापदंड में Foo मेज पर शामिल होने के शामिल कर सकते हैं:

SELECT 
    ft.FooTypeID, COUNT(f.FooID) 
FROM FooType as ft 
    JOIN FooConfig fc ON ft.NotificationConfigID = fc.FooConfigID 
    LEFT OUTER JOIN Foo f ON ft.FooTypeID = f.FooTypeID AND 
    DateDiff(day, GetDate(), f.Date) > 0 AND 
    DateDiff(day, GetDate(), f.Date) < fc.Days 
GROUP BY ft.FooTypeID 

तो FooConfig तालिका वैकल्पिक है, तो अतिरिक्त तारीख मापदंड नहीं किया जा सकता है (जैसा कि वे हमेशा गलत पर मूल्यांकन करेगा) - तो हमें कुछ ऐसा करना होगा:

SELECT 
    ft.FooTypeID, COUNT(f.FooID) 
FROM FooType as ft 
    LEFT OUTER JOIN FooConfig fc ON ft.NotificationConfigID = fc.FooConfigID 
    LEFT OUTER JOIN Foo f ON ft.FooTypeID = f.FooTypeID AND 
    (
     (DateDiff(day, GetDate(), f.Date) > 0 AND 
     DateDiff(day, GetDate(), f.Date) < fc.Days) 
     OR 
     (fc.Days IS NULL) 
    ) 
GROUP BY ft.FooTypeID 
+0

मैंने जो केस स्टेटमेंट लिखा था उससे कहीं अधिक सरल है। विश्वास नहीं कर सकता मैंने उस बारे में नहीं सोचा था। 'GROUP BY' – HLGEM

+0

+1, आप किसके बारे में बात कर रहे हैं? –

+0

@ कॉनराड याद रखने के लिए –

1

आप एक स्तंभ क्वेरी का उपयोग कर सकते

select pla.PlaceID, ISNULL((select COUNT(*) 
          from People 
          where PlaceID = pla.PlaceID),0) as peopleCount 
from Places as pla 
order by PlaceID 
+0

अद्यतन वाक्यविन्यास, तालिका को उपनाम करने के लिए भूल गया। – Fosco

+0

यह काम करेगा लेकिन यह 'जॉइन' समाधान की तुलना में अक्षम है, है ना? –

+0

सबसे बढ़िया! मैं इसे बिना किसी परेशानी के वास्तविक (अधिक जटिल) क्वेरी में अनुकूलित करने में सक्षम था, इसलिए मैं खुश हूं! जल्द ही मैं स्वीकार करने में सक्षम हूं ... –

0

COUNT() नल मानों की गणना नहीं करता है। तो अगर आप कोड कर सकते हैं:

SELECT pla.PlaceID, COUNT(peo.PlaceID) As nbr 
FROM Places AS pla 
LEFT JOIN People AS peo ON (peo.PlaceID = pla.PlaceID) 
0

DateDiff(day, GetDate(), f.Date) > 0 AND DateDiff(day, GetDate(), f.Date) < fc.Days वाम मिलती है में एक अंदरूनी मिलती है जो है कि तुम क्या नहीं करना चाहता हो जाता है।

यह एक वाम जोड़ने में शामिल होने के रखने के लिए या रिक्त है (या में जहां खंड डाल शामिल हों स्टीव मायने किया था)

SELECT 
    ft.FooTypeID, COUNT(f.FooID) 
FROM FooType as ft 
LEFT OUTER JOIN Foo f ON st.FooTypeID = s.FooTypeID 
LEFT JOIN FooConfig fc ON st.NotificationConfigID = fc.FooConfigID 
WHERE 
    (DateDiff(day, GetDate(), f.Date) > 0 
     or f.Date IS NULL) 
    AND 
    (DateDiff(day, GetDate(), f.Date) < fc.Days 
     or fc.Days Is NULLL or f.Date Is NULL) 
GROUP BY ft.FooTypeID 
संबंधित मुद्दे