Vou tentar fazer um gráfico com os dados do meu banco de dados SQL Server. Vou ter todas as ruas com a contagem dos usuários que moram nessa rua, mesmo que a contagem seja zero.
Para isso, eu tentei esta consulta:
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
E isso me dá essa saída:
| | street | count |
| - | ---------- | ----- |
| 1 | 1st street | 2 |
| 2 | 2nd street | 5 |
| 3 | 3rd street | 2 |
| 4 | 4th street | 1 |
O problema é que a 5ª rua, onde nenhum usuário mora, não aparece no resultado. Eu poderia fazer isso com o SQL server? Aqui você tem um violino
Atualização: Se o fizer right join
, obtive este resultado:
| | street | count |
| - | ---------- | ----- |
| 1 | 1st street | 2 |
| 2 | 2nd street | 5 |
| 3 | 3rd street | 2 |
| 4 | 4th street | 1 |
| 5 | 5th street | 1 |
sql-server
join
group-by
H. Pauwelyn
fonte
fonte
COUNT(u.streetid)
right join
eright outer join
são as mesmas coisas. Eu adicionei uma explicação na minha resposta, como sugerido por @ jpmc26.Respostas:
O motivo de sua consulta não funcionar como pretendido:
A junção interna fornece a interseção de 2 tabelas. No seu caso, não havia nenhuma entrada
5th street
na tabela de usuários e é por isso que a associação não produziu nenhuma entrada para isso.A junção externa (direita ou esquerda) fornecerá o resultado da junção interna e, além disso, todos os registros não qualificados da tabela esquerda ou direita, dependendo do tipo (esquerda ou direita) da junção externa.
Nesse caso, coloquei Street à esquerda da junção e usei a junção externa esquerda como você desejava em todas as ruas (a contagem par é zero) no seu conjunto de resultados.
Altere sua consulta de seleção para isso.
Resultado
fonte
Esta é uma maneira possível.
fonte
Limpando o código para funcionar em uma instância que diferencia maiúsculas de minúsculas ...
Quando você usa
COUNT
com um nome de coluna, ele contaNOT NULL
valores.Estou usando um
RIGHT JOIN
aqui para apaziguar Joe Obbish.Resultados:
fonte
Aqui está a consulta curta:
fonte