Me he quedado un poco atascado con algo de SQL. No creo que pueda formular la pregunta de manera brillante, así que déjame mostrarte.
Tengo dos mesas, una llamada persona, otra llamada cita. Estoy intentando devolver la cantidad de citas que tiene una persona (incluso si tienen cero). La cita contiene el person_id
y hay una person_id
por cita. Entonces COUNT(person_id)
es un enfoque sensato.
La consulta:
SELECT person_id, COUNT(person_id) AS "number_of_appointments"
FROM appointment
GROUP BY person_id;
Devolverá correctamente, la cantidad de citas que tiene un person_id. Sin embargo, una persona que tiene 0 citas no se devuelve (obviamente, ya que no está en esa tabla).
Ajustar la declaración para tomar person_id de la tabla de personas me da algo como:
SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;
Sin embargo, esto solo devolverá un person_id que tiene una cita y no lo que quiero, que es una devolución con personas que tienen 0 citas.
¿Alguna sugerencia por favor?
fuente
Respuestas:
Quieres una combinación externa para esto (y necesitas usar person como la tabla "conductora")
La razón por la que esto está funcionando es que la unión externa (izquierda) regresará
NULL
para aquellas personas que no tengan una cita. La función agregadacount()
no contaráNULL
valores y, por lo tanto, obtendrá un cero.Si desea obtener más información sobre las combinaciones externas, aquí hay un buen tutorial: http://sqlzoo.net/wiki/Using_Null
fuente
Debes usar en
LEFT JOIN
lugar deINNER JOIN
fuente
si realiza la combinación externa (con el recuento) y luego usa este resultado como una subtabla, puede obtener 0 como se esperaba (gracias a la función nvl)
Ex:
fuente
USE join para obtener 0 recuento en el resultado usando GROUP BY.
simplemente 'unirse' hace que Inner se una en MS SQL, así que vaya a la unión izquierda o derecha.
Si la tabla que contiene la clave principal se menciona primero en la CONSULTA, utilice la combinación IZQUIERDA o la combinación DERECHA.
P.EJ:
.
Tome el grupo de la tabla que tiene la clave principal y cuente de la otra tabla que tenga entradas / detalles reales.
fuente
Para cambiar aún menos en su consulta original, puede convertir su combinación en una
RIGHT
combinaciónEsto solo se basa en la respuesta seleccionada, pero como la combinación externa está en la
RIGHT
dirección, solo se debe agregar una palabra y menos cambios. - Recuerde que está ahí y, a veces, puede hacer que las consultas sean más legibles y requieran menos reconstrucción.fuente
El problema con LEFT JOIN es que si no hay citas, todavía devolverá una fila con un nulo, que cuando se agregue por COUNT se convertirá en 1, y parecerá que la persona tiene una cita cuando en realidad no tiene ninguna. Creo que esto dará los resultados correctos:
fuente