Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Oracle 10g: eine Spalte mehrmals abfragen

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

SQL ist nicht mein Spezialgebiet und deshalb richte ich meine Frage an Euch. Ich habe eine Tabelle mit folgenden Werten.

Zeit Strasse Geschwindigkeit

09:00 Waldstr. 37

09:05 Bergstr. 61

09:10 Bergstr. 63

09:15 Waldstr. 84

09:20 Hohemark 10

09:25 Hohemark 29

09:30 Waldstr. 95

09:35 Bergstr. 9

09:40 Bergstr. 20

09:45 Waldstr. 16

09:50 Waldstr. 21

09:55 Hohemark 8

10:00 Hohemark 57

10:05 Hohemark 76

10:10 Bergstr. 74

Jetzt würde ich gerne wissen, wie viele in jeder Strasse unter 30, zw. 30 und 50 und über 50 gefahren sind. In der Art von


SELECT Strasse, count(Geschwindigkeit<=30), count(Geschwindigkeit>30und <=50), count(Geschwindigkeit>50)

FROM tabelle

GROUP BY Strasse;

Ergebnis so (Werte stimmen nicht mit Tabelle oben überein):

Strasse "v < 30" "v > 30 < 50" "v > 50"

Waldstr 3 5 7

Bergstr 2 4 6

Hohemark 5 3 5

Ich weiss das oben geschriebenes Statement nicht funktioniert :) Nur hört an dieser Stelle mein SQL-Wissen auf. Habe schon meinen dicken Leitz mit SQL Unterlagen durchwühlt aber nichts gefunden was ich verwerten könnte.

Hoffe es kann mir einer helfen, hoffe ich habe es verständlich beschrieben.

Die besten Grüße

Andreas


SELECT DISTINCT

  strasse

  , (SELECT count(strasse) FROM tabelle WHERE strasse=a.strasse AND geschwindigkeit<30) 

  , (...)

  , (...) 

FROM 

  strasse a

sollte man nicht mit left oder right joins arbeiten, group by benutzen und having Geschwindigkeit > 30, between 30 and 50 .... arbeiten?

sollte man nicht mit left oder right joins arbeiten, group by benutzen und having Geschwindigkeit > 30, between 30 and 50 .... arbeiten?

Was spricht gegen die Lösung mit Subqueries?

Ich wüßte jetzt auf Anhieb nicht, wie ich das mit Joins, Group by und having lösen könnte. Hast du ein konkretes Beispiel für deinen Lösungsansatz? Würde mich nämlich brennend interessieren. :beagolisc

@jan: habs gerade ausprobiert, die Ergebnisse sind auf jedenfall interessant aber nicht ganz stimmig mit dem was ich erwartet habe (ca. um dem Faktor 100-1000 zu hoch).

@rest: joins waren mir immer ein graus ... bin natürlich aber für alle Möglichkeiten offen.

Aber ich spiel noch ein wenig mit dem SQs rum.

Eine ungetestete Lösung über Join/Subqueries:


SELECT 

  a.strasse, 

  b.anz, 

  c.anz, 

  d.anz 

FROM 

  ()a 

LEFT JOIN 

  ()b 

ON 

  a.strasse=b.strasse 

LEFT JOIN 

  ()c 

ON 

  a.strasse=c.strasse 

LEFT JOIN 

  ()d 

ON 

  a.strasse=d.strasse

Ein Left join über 4 Subqueries

a. Liste der Strassen

SELECT DISTINCT strasse FROM tabelle

b. < 30km

SELECT strasse, count(strasse) anz FROM tabelle WHERE geschwindigkeit<30 GROUP BY strasse

c. >30 <50

...

d.

...

Subquery ()a braucht man um auch dann Daten zu erhalten, wenn in einer Kategorie (z.B <30km) keine/weniger Strassen vorhanden sind

Das mit den JOINs hat geklappt, danke für den Tip, da wäre ich nie drauf gekommen. Aber länger ich drüber schaue, desto logischer wirds.

Besten Dank

Andreas

Und auch ganz ohne Join:

SELECT count(*),strasse ,'Geschwindigkeit unter 30' Geschwindigkeit

WHERE geschwindigkeit < 30

GROUP BY strasse

UNION ALL

SELECT count(*),strasse ,'Geschwindigkeit zw. 30 und 50' Geschwindigkeit

WHERE geschwindigkeit between 30 and 50

GROUP BY strasse

UNION ALL

SELECT count(*),strasse ,'Geschwindigkeit größer 50' Geschwindigkeit

WHERE geschwindigkeit between 30 and 50

GROUP BY strasse;

Dim

PS: Wieso Outer Joins?

das wird meines wissens nicht funktionieren, da bei union die spalten identisch sein müssen und ausserdem untereinander eingefügt werden ...

bei joins wirds quasi nebeneinander eingefügt

das wird meines wissens nicht funktionieren

Jep hast recht. Hab überall die FROM Klausel vergessen... :old

Ausserdem ist beim letzten SQL die WHERE Bedingung falsch :rolleyes:

da bei union die spalten identisch sein müssen

Ne das passt schon. Sind ja alle vom gleichen Typ.

bei joins wirds quasi nebeneinander eingefügt

Stimmt. Mein Statement liefert das Ergebnis untereinander. Da müsste man noch pivotieren.

Dim

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.