Pregunta

Tengo datos SQL que se ven así

events
id name         capacity
1  Cooking        10
2  Swimming       20
3  Archery        15

registrants
id  name
1   Jimmy
2   Billy
3   Sally

registrant_event
registrant_id  event_id
     1             3
     2             3
     3             2

Me gustaría seleccionar todos los campos en 'eventos', así como un campo adicional que sea el número de personas que actualmente están registradas para ese evento. En este caso, Tiro con arco tendría 2 participantes, Natación tendría 1 y Cocina tendría 0.

Me imagino que esto podría lograrse en una sola consulta, pero no estoy seguro de la sintaxis correcta. ¿Cómo se escribiría una consulta para obtener esos datos?

Actualización: ¡Gracias por las excelentes respuestas, todos ustedes rockean!

¿Fue útil?

Solución

SELECT e.*, ISNULL(ec.TotalRegistrants, 0) FROM events e LEFT OUTER JOIN
(
   SELECT event_id, Count(registrant_id) AS TotalRegistrants
   FROM registrant_event
   GROUP BY event_id
) ec ON e.id  = ec.event_id

Otros consejos

SELECT Events.ID, Events.Name, Events.Capacity, 
       ISNULL(COUNT(Registrant_Event.Registrant_ID), 0)
FROM Events
LEFT OUTER JOIN Registrant_Event ON Events.ID = Registrant_Event.Event_ID
GROUP BY Events.ID, Events.Name, Events.Capacity
select d.id1, d.name, d.cappacity, count(d.b_id) as number_of_people
from (select eve.id1,eve.name,eve.cappacity,re_eve.b_id
     from eve left join re_eve on eve.id1 = re_eve.b_id) d
group by d.id1, d.name, d.cappacity

Probé esto en Oracle 11g, y parece funcionar

SELECT e.id, e.name, e.capacity, COUNT(re.event_id)
FROM events e
LEFT JOIN registrant_event re
  ON e.id = re.event_id
GROUP BY e.id, e.name, e.capacity
select e.id, e.name, e.capacity, IsNull(re.eventCount,0) from events e
left join (
 select count(event_id) as eventCount, event_id  from registrant_event group by event_id
 ) re 
on e.id = re.event_id
SELECT e.id, count(*) AS NumRegistrants
FROM events e
LEFT JOIN registrant_event re ON re.event_id=e.id
GROUP BY e.id

Tenga en cuenta que esto devolverá 1 en lugar de 0 para eventos sin registrantes. Para que muestre 0 en su lugar, debes complicarte un poco más:

SELECT *,
    (SELECT COUNT(*) FROM registrant_event WHERE event_id=id) AS NumRegistrants
FROM events
SELECT
  events.*
, COUNT(registrant_event.registrant_id) AS registrantsCount
FROM events
LEFT JOIN registrant_event ON events.id = registrant_event.event_id
GROUP BY events.id
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top