Sayının sıfır olduğu bir grubu nasıl edinebilirim?


12

SQL sunucu veritabanımdaki verilerden bir grafik yapmaya çalışacağım. Bu caddede yaşayan kullanıcı sayısı ile tüm sokaklarımın sayısı sıfır bile.

Bunun için bu sorguyu denedim:

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

Ve bana bu çıktıyı veriyor:

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

Sorun, hiçbir kullanıcının yaşamadığı 5. caddenin sonuçta görünmemesidir. Bunu SQL sunucusuyla yapabilir miyim? Burada bir keman var

Güncelleme: Eğer yaparsam right join, bu sonucu aldım:

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

Bu kemanı gör.


4
Kimse sorgunuzun neden beklenen sonucu döndürmediğini açıklamıyorsa : Toplama işlevi NULL'ları yok saydığından, iç tablodaki (dış tablodan saydığınız) NOT NULL (tanımlayabilmek için) olarak bilinen bir sütun saymalısınız. veriler içindeki NULL ve Outer Join tarafından oluşturulan NULL arasında ayrım yapın). En kolay yol birleştirme sütununu COUNT(u.streetid)
saymaktır

Çünkü right joinve right outer joinaynı şeyler. @ Jpmc26 tarafından önerildiği üzere cevabımda bir açıklama ekledim.
SqlWorldWide

Yanıtlar:


18

Sorgunuzun istendiği gibi çalışmadığının nedeni:

İç birleşim size 2 tablonun kesişim noktasını verir. Sizin durumunuzda, 5th streetkullanıcı tablonuz için herhangi bir giriş yoktu ve bu yüzden join bunun için herhangi bir giriş üretmedi.

Dış birleşim (sağ veya sol) iç birleşimin sonucunu ve ek olarak dış birleşimin tipine (sol veya sağ) bağlı olarak sol veya sağ tablodan tüm eleme olmayan kayıtları verecektir.

Bu durumda, Street'i birleşimin soluna koydum ve sonuç kümenizdeki tüm sokakları (hatta sayı sıfır) istediğiniz gibi sol dış birleşimi kullandım.

Seçim sorgunuzu bununla değiştirin.

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

Sonuç resim açıklamasını buraya girin


2
Benim için sayım (*) 'dan saymaya (customer.id) geçiş - yukarıda gösterilene benzer - kritik farkı yarattı. Teşekkürler :)
Zeek

9

Bu olası bir yol.

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

7

Büyük / küçük harfe duyarlı bir örnek üzerinde çalışmak için kodu temizleme ...

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 );

Bir COUNTsütun adıyla kullandığınızda, NOT NULLdeğerleri sayar .

RIGHT JOINJoe Obbish'i yatıştırmak için burada kullanıyorum .

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

Sonuçlar:

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

0
  1. Sayıyı sokak kimliğine göre alın
  2. sokak kimliğiyle sokak kimliğine katıl
  3. Boş değer sonuçlanacağı için Coalsesce kullanın

İşte kısa sorgu:

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

Sol birleşimle
rakesh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.