एक समूह कैसे प्राप्त करें जहां गिनती शून्य है?


12

मैं अपने SQL सर्वर डेटाबेस से डेटा से एक ग्राफ बनाने की कोशिश करूँगा। मेरे पास उन उपयोगकर्ताओं की गिनती वाली सभी सड़कें होंगी जो इस गली में रह रहे हैं यहां तक ​​कि गिनती शून्य है।

इसके लिए मैंने यह क्वेरी आज़माई है:

Create table Streets(
  ID int IDENTITY  primary key,
  Name varchar(100)
);

create table users(
  ID int IDENTITY  primary key,
  Username varchar(100),
  StreetID int references Streets(id)
);

insert into streets values ('1st street'), ('2nd street'), ('3rd street'), 
                           ('4th street'), ('5th street');
insert into users values ('Pol', 1), ('Doortje', 1), ('Marc', 2), ('Bieke', 2), 
                         ('Paulien', 2), ('Fernand', 2), ('Pascal', 2), ('Boma', 3), 
                         ('Goedele', 3), ('Xavier', 4);

select s.name as street, count(s.name) as count 
from users u inner join streets s on u.streetid = s.id
group by s.name

और यह मुझे यह आउटपुट देता है:

|   | street     | count |
| - | ---------- | ----- |
| 1 | 1st street | 2     |
| 2 | 2nd street | 5     |
| 3 | 3rd street | 2     |
| 4 | 4th street | 1     |

समस्या यह है कि 5 वीं सड़क, जहां कोई उपयोगकर्ता नहीं रहता है, परिणाम पर दिखाई नहीं देता है। क्या मैं SQL सर्वर के साथ ऐसा कर सकता हूं? यहाँ आपको एक फील मिला है

अद्यतन: यदि मैं करता हूं right join, तो मुझे यह परिणाम मिला है:

|   | street     | count |
| - | ---------- | ----- |
| 1 | 1st street | 2     |
| 2 | 2nd street | 5     |
| 3 | 3rd street | 2     |
| 4 | 4th street | 1     |
| 5 | 5th street | 1     | 

देखिए यह फील।


4
जैसा कि किसी ने भी नहीं बताया कि आपकी क्वेरी अपेक्षित परिणाम क्यों नहीं लौटाती है: जैसे कि कुल फ़ंक्शन NULLs को अनदेखा करते हैं, आपको आंतरिक तालिका (आप बाहरी तालिका से गिना जाता है) से एक कॉलम की गणना करनी चाहिए जिसे नॉट NULL के रूप में परिभाषित किया जाना है (सक्षम होने के लिए) डेटा के भीतर NULLs और बाहरी जुड़ाव द्वारा बनाए गए NULL के बीच अंतर करना)। सबसे आसान तरीका है कि ज्वाइन कॉलम को COUNT(u.streetid)
गिनें

क्योंकि right joinऔर right outer joinवही चीजें हैं। मैंने अपने उत्तर में एक स्पष्टीकरण जोड़ा है जैसा कि @ jpmc26 द्वारा सुझाया गया है।
SqlWorldWide

जवाबों:


18

आपके प्रश्न का उद्देश्य के अनुसार काम नहीं किया गया है:

भीतरी जुड़ाव आपको 2 तालिकाओं का प्रतिच्छेदन देता है। आपके मामले में, 5th streetआपके उपयोगकर्ता तालिका में कोई प्रविष्टि नहीं थी और यही कारण है कि जुड़ने ने उसके लिए कोई प्रविष्टि नहीं बनाई।

बाहरी जुड़ाव (दाएं या बाएं) आंतरिक जुड़ने का परिणाम देगा और इसके अलावा बाहरी जुड़ाव के प्रकार (बाएं या दाएं) के आधार पर बाएं या दाएं तालिका से सभी गैर-योग्यता वाले रिकॉर्ड।

इस स्थिति में, मैंने स्ट्रीट को जॉइन के बाईं ओर रखा और लेफ्ट एक्सटर्नल जॉइन का इस्तेमाल किया क्योंकि आप अपने रिजल्ट सेट में सभी गलियों (यहां तक ​​कि गिनती शून्य) चाहते थे।

अपनी चुनिंदा क्वेरी को इसमें बदलें।

SELECT S.Name AS Street,
       Count(U.Username) AS COUNT
FROM Streets S
LEFT OUTER JOIN Users U ON U.Streetid = S.Id
GROUP BY S.Name

परिणाम यहाँ छवि विवरण दर्ज करें


2
मेरे लिए, गिनती (*) से बदलकर गिनती (customer.id) - ऊपर दिखाए गए समान - महत्वपूर्ण अंतर बना दिया। धन्यवाद :)
Zeek

9

यह एक संभव तरीका है।

select s.name as streets,
       (select count(*)
        from   users
        where  StreetID = s.id) cnt
from   streets s;

7

केस संवेदी उदाहरण पर काम करने के लिए कोड की सफाई ...

CREATE TABLE Streets
(
    ID INT IDENTITY PRIMARY KEY,
    Name VARCHAR(100)
);

CREATE TABLE users
(
    ID INT IDENTITY PRIMARY KEY,
    Username VARCHAR(100),
    StreetID INT
        REFERENCES Streets ( ID )
);

INSERT INTO Streets
VALUES ( '1st street' ),
    ( '2nd street' ),
    ( '3rd street' ),
    ( '4th street' ),
    ( '5th street' );
INSERT INTO users
VALUES ( 'Pol', 1 ),
    ( 'Doortje', 1 ),
    ( 'Marc', 2 ),
    ( 'Bieke', 2 ),
    ( 'Paulien', 2 ),
    ( 'Fernand', 2 ),
    ( 'Pascal', 2 ),
    ( 'Boma', 3 ),
    ( 'Goedele', 3 ),
    ( 'Xavier', 4 );

जब आप COUNTकिसी स्तंभ नाम के साथ उपयोग करते हैं, तो यह NOT NULLमानों को गिनता है।

मैं RIGHT JOINयहाँ जो Obbish अपील करने के लिए उपयोग कर रहा हूँ ।

SELECT   s.Name AS street, COUNT(u.Username) AS count
FROM     users AS u
RIGHT JOIN Streets AS s
ON u.StreetID = s.ID
GROUP BY s.Name

परिणाम:

street      count
1st street  2
2nd street  5
3rd street  2
4th street  1
5th street  0

0
  1. स्ट्रीट आईडी से गिनती प्राप्त करें
  2. सड़कों से आईडी के साथ सड़क आईडी में शामिल हों
  3. नल का उपयोग करें क्योंकि शून्य मान परिणाम देगा

यहाँ छोटी क्वेरी है:

select Name, coalesce( u.ct,0)ct FROM streets s left join (
select StreetID,count(*)ct from users group by StreetID)u on s.ID=u.StreetID

वह बाएं हाथ से है
राकेश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.