2017-05-03 2 views
0

Wie kann ich die Anzahl der Teilnehmer unter dem Durchschnitt erhalten? Dies ist meine Oracle AbfrageSQL-Finding-Gruppe, wo die Teilnahme weniger als der Durchschnitt

SELECT e.event_id EventID,c.concert_name ConcertName, c.concert_date, 
AVG(e.attendance) Attendance 

FROM event e INNER JOIN concert c ON c.concert_id = e.concert_id 
WHERE Attendance - AVG(e.Attendance) 
GROUP BY c.concert_id ASC; 
+0

Dies funktioniert aber eine der Zeilen zeigt Anwesenheit, die höher als der Durchschnitt ist. Was könnte falsch sein? – user3346221

Antwort

0

Mit der AVG(..) OVER() analytische Funktion (und ohne eine korrelierte Unterabfrage):

SELECT eventId, 
     ConcertName, 
     Concert_Date 
FROM (
    SELECT e.event_id EventID, 
     c.concert_name ConcertName, 
     c.concert_date, 
     e.attendance, 
     AVG(e.attendance) OVER() AS avg_Attendance 
    FROM event e 
     INNER JOIN concert c 
     ON c.concert_id = e.concert_id 
) 
WHERE attendance < avg_attendance; 
+0

AVG FROM dual (e.attendance) OVER() AS avg_Attendance * FEHLER bei Zeile 9: ORA-00907: fehlende rechte Klammer. * gerade ist kurz vor e.attendance – user3346221

+0

@ user3346221 Danke. Behoben, es gab ein fehlendes Komma vor dieser Zeile. – MT0

+0

Es funktioniert, aber wenn ich versuche, zusätzliche Felder in der Select-Anweisung auswählen, aber ich bekomme einen Fehler. Bin der erste Teil Modifizieren wie zum Vergleich folgt eventId SELECT, ConcertName, Concert_Date, Anwesenheit, AVG (Anwesenheit) Fehler: SELECT eventId, * FEHLER in Zeile 1: ORA-00937: keine einzige Gruppengruppenfunktion Fehler near eventid – user3346221

0

Sie können mit dieser Art und Weise versuchen:

SELECT e.event_id EventID,c.concert_name ConcertName, c.concert_date, 
AVG(e.attendance) Attendance 
FROM event e INNER JOIN concert c ON c.concert_id = e.concert_id 
WHERE e.attendance < (select AVG(ev.attendance) from event ev) 
GROUP BY c.concert_id ASC; 
Verwandte Themen