Frage

Ich habe SQL-Daten, die wie folgt aussehen

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

Ich möchte alle Felder in ‚Event‘ sowie ein zusätzliches Feld wählen, die die Zahl der Menschen, die für dieses Ereignis zur Zeit registriert sind. In diesem Fall würde Archery 2 Registranten hat, Schwimmen 1 haben würde, und Kochen würde 0 haben.

Ich stelle mir dies in einer einzigen Abfrage erreicht werden könnte, aber ich bin die richtigen Syntax nicht sicher. Wie würde eine Abfrage geschrieben wird, dass die Daten zu bekommen?

Update: Vielen Dank für die tollen Antworten, Sie alle Röcke

War es hilfreich?

Lösung

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

Andere Tipps

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

Getestet habe ich diese in Oracle 11g, und es scheint zu funktionieren

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

Beachten Sie, dass diese 1 zurückkehren wird anstelle von 0 für Ereignisse ohne Registranten. Um es 0 statt zu zeigen, haben Sie bekommen ein wenig komplizierter:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top