Meine Datenbanken beteiligt aussehen wie so:SQL Query - Abfragen AVG von COUNT beteiligt und Abfragen Termine
PEAK (NAME, ELEV, DIFF, MAP, REGION)
BERGSTEIGER (Name, Geschlecht)
TEILGENOMMEN (trip_id, NAME)
geklettert (trip_id, PEAK, WENN)
- PEAK gibt Informationen über die Berggipfel, die der Benutzer interessiert. Die Tabelle listet den Namen jedes Gipfels auf, seine Höhe (in ft), seinen Schwierigkeitsgrad (auf einer Skala von 1-5), die Karte, die er ist lokalisiert auf und die Region der Sierra Nevada, in der es sich befindet.
- CLIMBER listet die Mitglieder des Vereins auf und gibt ihren Namen und Geschlecht an.
- PARTICIPATED gibt die Gruppe von Kletterern an, die an den verschiedenen Klettertouren teilgenommen haben. Die Anzahl der Teilnehmer in jeder Reise variiert.
- CLIMBED gibt an, welche Gipfel auf jeder Kletterroute erklommen wurden, zusammen mit den Daten, mit denen jeder Gipfel erklommen wurde.
Ich brauche Hilfe w/eine SQL-Abfrage für diese 2 Beispielszenarien zu schreiben:
- Berechnen Sie die durchschnittliche Anzahl der Spitzen von den Männern in dem Verein und von den Frauen in dem Club skaliert.
- Welche Leute haben jeden einzelnen Gipfel bestiegen, den Maria bestiegen hat?
- Wer hat in etwa 60 Tagen mehr als 20 Gipfel erklommen?
EDIT: Erste Abfrage funktioniert jetzt und sieht wie folgt aus:
SELECT SEX, AVG(num_peaks) AS avg_peaks
FROM
(
SELECT CLIMBER.*, COUNT(CLIMBED.PEAK) num_peaks
FROM CLIMBED
INNER JOIN PARTICIPATED
ON PARTICIPATED.TRIP_ID = CLIMBED.TRIP_ID
RIGHT OUTER JOIN CLIMBER
ON CLIMBER.NAME = PARTICIPATED.NAME
GROUP BY CLIMBER.NAME, CLIMBER.SEX
)
GROUP BY SEX;
Diese Abfrage mir die Gesamtzahl der Spitzen gibt stieg mein Männchen und Weibchen. Aber ich kann nicht herausfinden, wie man die Mittelwerte anstelle der Zählungen erhält. Ich weiß, dass Sie nicht einfach die COUNT-Funktion zu AVG b/c ändern können, meine Daten sind in der Zeichenfolge-Form und nicht Integer.
Meine zweite Abfrage sieht so aus:
SELECT DISTINCT PARTICIPATED.NAME
FROM PARTICIPATED
INNER JOIN CLIMBED
ON PARTICIPATED.TRIP_ID = CLIMBED.TRIP_ID
WHERE CLIMBED.PEAK IN
(
SELECT CLIMBED.PEAK
FROM CLIMBED
INNER JOIN PARTICIPATED
ON PARTICIPATED.TRIP_ID = CLIMBED.TRIP_ID
WHERE NAME IN ('MARIA')
)
AND PARTICIPATED.NAME NOT IN ('MARIA');
Die Abfrage gibt mir all die Menschen, die einen Höhepunkt erklommen haben, dass Maria auch geklettert, aber gibt mir nicht nur die Menschen, die geklettert alle einzigen Gipfel, den Maria bestiegen hat. Nicht sicher, wie man den Rest der Leute auf diese Art herausfiltert.
Und schließlich meine letzte Abfrage sieht so aus:
SELECT PARTICIPATED.NAME, COUNT(DISTINCT CLIMBED.PEAK)
FROM PARTICIPATED
LEFT JOIN CLIMBED
ON CLIMBED.TRIP_ID = PARTICIPATED.TRIP_ID
GROUP BY PARTICIPATED.NAME;
Diese Abfrage alle der Bergsteiger Namen gibt und die Gesamtzahl der Spitzen, die sie haben jeweils geklettert, aber ich habe keine Ahnung, wie es zu filtern noch mehr, so dass es nur Leute zeigt, die innerhalb von 60 Tagen mehr als 20 Gipfel erklommen haben. Ich versuchte
HAVING CLIMBED.WHEN BETWEEN -60 AND 60;
verwenden, aber das funktioniert nicht.
Jede Hilfe wird sehr geschätzt, und ich verwende Oracle Express als meine DB.
Sie haben diese Frage bereits gestellt [hier] (http://stackoverflow.com/questions/36437653/sql-query-average-climbed-and-pair-that-has-climbed-the-most-peaks) – MT0
Keine Antwort auf deine ganze Frage. Aber Ihre zweite Abfrage sollte 'WHERE CLIMBED.PEAK = ALL (... WO NAME = 'MARIA') UND NAME <> 'MARIA' 'haben. Die Verwendung von "IN" entspricht = ANY (...), aber Sie benötigen alle Peaks, nicht nur einen. Außerdem ist es sinnlos, IN für einzelne Werte zu verwenden, stattdessen = und <>. Und Sie haben ein zusätzliches Semikolon. Siehe [dieser Beitrag über ORACLE und ANY, ALL und SOME] (https://oracle-base.com/articles/misc/all-any-some-comparison-conditions-in-sql). –