গণনা শূন্য যেখানে এমন একটি দল কীভাবে পাবেন?


12

আমি আমার এসকিউএল সার্ভার ডাটাবেস থেকে ডেটা থেকে গ্রাফ তৈরি করার চেষ্টা করব। এই রাস্তায় যারা বাস করছেন তাদের গণনা সহ আমি সমস্ত রাস্তায় থাকব এমনকি গণনাও শূন্য।

এর জন্য আমি এই ক্যোয়ারির চেষ্টা করেছি:

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 ম রাস্তায়, যেখানে কোনও ব্যবহারকারী বাস করেন না, ফলাফলটিতে উপস্থিত হয় না। আমি কি এসকিউএল সার্ভার দিয়ে এটি করতে পারি? এখানে আপনি একটি ঝাঁকুনি পেয়েছেন

আপডেট: আমি যদি করি তবে আমি 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
আপনার জিজ্ঞাসাটি প্রত্যাশিত ফলাফলটি কেন ফেরায় না তা কেউ ব্যাখ্যা না করায়: সমষ্টিগত ফাংশনটি NULL উপেক্ষা করে আপনাকে অবশ্যই অভ্যন্তরীণ সারণী থেকে একটি কলাম গণনা করতে হবে (আপনি বাইরের টেবিল থেকে গণনা করেছেন) যা নল নয় হিসাবে সংজ্ঞায়িত হিসাবে পরিচিত (সক্ষম হতে ডেটাতে থাকা NULL এবং আউটার জয়েন দ্বারা নির্মিত NULL এর মধ্যে পার্থক্য করুন)। : সবচেয়ে সহজ উপায় কলাম যোগদানের গণনা হয়COUNT(u.streetid)
dnoeth

কারণ right joinএবং right outer joinএকই জিনিস। @ Jpmc26 দ্বারা প্রস্তাবিত হিসাবে আমি আমার উত্তরে একটি ব্যাখ্যা যুক্ত করেছি।
স্কেল ওয়ার্ল্ডওয়াইড

উত্তর:


17

আপনার জিজ্ঞাসাটি যেমনটি কাজ করেছিল তেমনটি হয়নি:

অভ্যন্তরীণ যোগদান আপনাকে 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

ফলাফল এখানে চিত্র বর্ণনা লিখুন


1
আমার জন্য, গণনা (*) থেকে গণনা (ગ્રાહার আইডি) এ পরিবর্তন করা - উপরে দেখানো অনুরূপ - গুরুত্বপূর্ণ পার্থক্য তৈরি করেছে। ধন্যবাদ :)
জিউক

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জো ওবিশকে সন্তুষ্ট করার জন্য আমি এখানে একটি ব্যবহার করছি ।

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

এটি বাম যোগদানের সাথে রয়েছে
রাকেশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.