Intentaré hacer un gráfico a partir de los datos de mi base de datos del servidor SQL. Tendré todas las calles con el recuento de los usuarios que viven en esta calle, incluso el recuento es cero.
Para esto he intentado 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
Y me da esta salida:
| | street | count |
| - | ---------- | ----- |
| 1 | 1st street | 2 |
| 2 | 2nd street | 5 |
| 3 | 3rd street | 2 |
| 4 | 4th street | 1 |
El problema es que la 5ta calle, donde no vive ningún usuario, no aparece en el resultado. ¿Podría hacer esto con el servidor SQL? Aquí tienes un violín
Actualización: si lo hago right join
, tengo 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
fuente
fuente
COUNT(u.streetid)
right join
yright outer join
son las mismas cosas. Agregué una explicación en mi respuesta según lo sugerido por @ jpmc26.Respuestas:
La razón por la que su consulta no funcionó como se esperaba:
La unión interna le ofrece la intersección de 2 tablas. En su caso, no había ninguna entrada
5th street
en su tabla de usuarios y es por eso que join no produjo ninguna entrada para eso.La unión externa (derecha o izquierda) dará el resultado de la unión interna y, además, todos los registros no calificados de la tabla izquierda o derecha, según el tipo (izquierda o derecha) de unión externa.
En este caso, puse Street a la izquierda de la combinación y utilicé la combinación externa izquierda, ya que quería todas las calles (incluso el recuento es cero) en su conjunto de resultados.
Cambie su consulta de selección a esto.
Resultado
fuente
Esta es una forma posible.
fuente
Limpiando el código para trabajar en una instancia sensible a mayúsculas y minúsculas ...
Cuando se usa
COUNT
con un nombre de columna, cuenta losNOT NULL
valores.Estoy usando un
RIGHT JOIN
aquí para apaciguar a Joe Obbish.Resultados:
fuente
Aquí está la breve consulta:
fuente