Verständnisproblem bei SQL Abfrage

Kirby.exe

Top Contributor
Also ich habe die folgende Aufgabe:

Bildschirmfoto 2021-01-17 um 12.54.16.png

Soweit habe ich verstanden, dass wir mittels den Tabellen Aufnahme, CD und Stueck zählen sollen, wie viele Stuecke auf einer CD sind und dann sollen wir diese Anzahl durch den Wert anz_cds (von der Tabelle CD) dividieren und in eine Tabelle schreiben. Aus dieser Tabelle werden dann die obigen Werte ermittelt. Ich verstehe aber nicht ganz wie ich diese Unteranfrage aufbauen soll... So werden die Tabellen gelinked:

SQL:
Select s1.snr,
        s1.knr,
        s1.titel,
        s1.tonart,
        s1.opus,
        c1.cdnr,
        c1.name,
        c1.hersteller,
        c1.anz_cds,
        c1.gesamtspielzeit
From Stueck s1,
    Aufnahme a1,
    CD c1
Where a1.cdnr = c1.cdnr
        and s1.snr = a1.snr
 

Kirby.exe

Top Contributor
Was genau verstehst Du daran nicht? Du brauchst die Anzahl der Stücke gruppiert nach cd_nr.
Danke das hilft schonmal sehr :) Aber wie teile ich die Counts für jede CD dann? Also kann ich einfach (count(s1.snr)/c1.anz_cds) machen und er zählt dann erst alle und dividiert dann?


Also so:
SQL:
With res as (Select c1.cdnr,
                    (count(s1.snr)/c1.anz_cds)
            From Stueck s1,
                    Aufnahme a1,
                    CD c1
            Where a1.cdnr = c1.cdnr
                    and s1.snr = a1.snr
            Group By c1.cdnr)
 

Kirby.exe

Top Contributor
Habe es jetzt einfach so gemacht:
SQL:
With res as (Select c1.cdnr,
                    count(s1.snr) as anz
            From Stueck s1,
                    Aufnahme a1,
                    CD c1
            Where a1.cdnr = c1.cdnr
                    and s1.snr = a1.snr
            Group By c1.cdnr)
Select round(min(res.anz/c2.anz_cds),1),
        round(max(res.anz/c2.anz_cds),1),
        round(avg(res.anz/c2.anz_cds),1)
From CD c2, res
Where res.cdnr = c2.cdnr

Diese Anfrage liefert das richtige Ergebnis :)
 

mihe7

Top Contributor
Ja, oder den Subselect direkt in der FROM-Clause angeben. Die Division könntest Du gleich in res durchführen. Ist es eigentlich vorgegeben/angedacht, ohne INNER JOIN zu arbeiten?
 

mihe7

Top Contributor
Das wird der Query-Optimizer richten, aber im Prinzip sagst Du: hey, bilde erstmal das Kreuzprodukt und filter mir die raus, für die gilt: ...
 

Kirby.exe

Top Contributor
Yes you're right xD Ich hatte noch ein Problem zu einer ähnlichen Aufgabe....Also die Aufgabenstellung ist die folgende:
Bildschirmfoto 2021-01-17 um 13.55.06.png

Ich habe ein "fertiges" Query, welches mir auch teile der erwarteten Aufgaben liefert. Jedoch jetzt zu meinem Problem...Die Filter Anfrage, welche sich die Anzahl der gesamten Stücken mit einer Tonart verschieden von Null holt gibt mir die korrekten Personen und Anzahlen her. Nun habe ich noch die anderen Tabellen mit eingebunden für Dur und Moll und nun fehlen plötzlich einträge...Ich sehe nicht ganz warum das passiert...Hier ist der Code:

SQL:
With res as (Select k1.knr,
                    count(s1.tonart) as anz_tonart
            From Komponist k1,
                    Stueck s1
            Where k1.knr = s1.knr
            Group By k1.knr),
    dur as (Select k3.knr,
                count(s3.tonart) as anz_tonart
            From Komponist k3,
                Stueck s3
            Where k3.knr = s3.knr
                    and s3.tonart Like '%-dur'
            Group By k3.knr),
    moll as (Select k4.knr,
                    count(s4.tonart) as anz_tonart
             From Komponist k4,
                    Stueck s4
            Where k4.knr = s4.knr
                    and s4.tonart Like '%-moll'
            Group By k4.knr)
Select k2.name,
        k2.vorname,
        res.anz_tonart as anzahl_tonarten,
        round((dur.anz_tonart*100.0)/res.anz_tonart) as prozent_dur,
        round((moll.anz_tonart*100.0)/res.anz_tonart) as prozent_moll
From Komponist k2,
    res,
    dur,
    moll
Where k2.knr = res.knr
        and k2.knr = dur.knr
        and k2.knr = moll.knr
        and res.anz_tonart >= 3
Group By k2.name, k2.vorname, res.anz_tonart, dur.anz_tonart, moll.anz_tonart
 

mihe7

Top Contributor
Ich sehe nicht ganz warum das passiert...
Ich auch nicht :) Lass mal Zeile 34 weg.

Die Behandlung von res kannst Du mit HAVING vereinfachen:
SQL:
SELECT
  k.knr,
  count(s.tonart) as stuecke_ges
FROM Komponist k
  INNER JOIN Stueck s ON k.knr = s.knr
GROUP BY k.knr
HAVING count(s.tonart) >= 3
Damit liefert der Subselect schon mal von Haus aus nur noch die Komponisten mit wenigstens drei Stücken, für die die Tonart bekannt ist und die Gesamtzahl dieser Stücke (count(s.tonart) liefert nicht die Zahl verschiedener Tonarten sondern die Zahl der Datensätze, deren Tonart nicht NULL ist und somit die Anzahl der gesuchten Stücke).

Kannst Du mal ein SQL-Dump posten (CREATE TABLE, INSERTs)? Was für eine DB verwendest Du?
 

Kirby.exe

Top Contributor
So viel zum Thema OpenData :)

OK, dann andersrum:



Fehlen Datensätze oder Zahlen?
Datensätze XD Wenn ich die Anfrage ausführt um nur die Anzahl der Tonarten zu bekommen (also egal ob dur oder moll) dann erhalte ich 9 Datensätze. Wenn ich aber alles zusammen verwende bekomme ich nur 7 Datensätze...xD Was mich verwirrt ist, dass ich doch gar nichts einschränke oder? Ich linke nur die res tabelle mit der dur und moll tabelle zusammen oder nicht ? xD
 

Kirby.exe

Top Contributor
Ahhh ich glaube ich habe eine vermutung....Bei den beiden welchen Fehlen ist die Anzahl von Moll Tonarten = 0...XD Kann es sein, dass diese dann gar nicht im Query als in der Tabelle Moll gelistet werden?
 

mihe7

Top Contributor
Ah, das sind diese kleinen Fallstricke. Das Problem ist, dass wir Komponisten mit Stuecke joinen und dann nach der Tonart einschränken. Wenn ein Komponist kein Stück dieser Tonart hat, dann ist der Join leer und damit liefert moll auch keinen Satz für diesen Komponisten... Analog für dur.
 

Kirby.exe

Top Contributor
Ah, das sind diese kleinen Fallstricke. Das Problem ist, dass wir Komponisten mit Stuecke joinen und dann nach der Tonart einschränken. Wenn ein Komponist kein Stück dieser Tonart hat, dann ist der Join leer und damit liefert moll auch keinen Satz für diesen Komponisten... Analog für dur.
Ja gut xD Wie kann ich da jetzt nen Default Case machen? Also wenn Zeile nicht existiert dann einfach auf 0 setzen xD oder so?
 

Kirby.exe

Top Contributor
Alright xD Ich habe jetzt sowas wie Cases gefunden, aber das kommt vom JOIN, das knr ambigous ist xD Keine Ahnung wie man das umgehen könnte :)

SQL:
Select ks.knr,
       sum(case when ks.tonart is not null then 1 else 0 end) as gesamt,
       sum(case when ks.tonart Like '%-dur' then 1 else 0 end) as dur,
       sum(case when ks.tonart Like '%-moll' then 1 else 0 end) as moll
From (Komponist
      JOIN Stueck ON Komponist.knr = Stueck.knr) as ks
GROUP BY ks.knr

Edit:

Ich sollte mehr Kaffe trinken xD
So funktionierts:
SQL:
Select Komponist.knr,
       sum(case when Stueck.tonart is not null then 1 else 0 end) as gesamt,
       sum(case when Stueck.tonart Like '%-dur' then 1 else 0 end) as dur,
       sum(case when Stueck.tonart Like '%-moll' then 1 else 0 end) as moll
From Komponist
        JOIN Stueck ON Komponist.knr = Stueck.knr
GROUP BY Komponist.knr
 

Kirby.exe

Top Contributor
Update:

Ich habe es gelöst xD Meine gute heute war einfach nicht mein Tag xD

SQL:
With gesamt as (Select Komponist.knr,
                sum(case when Stueck.tonart is not null then 1 else 0 end) as stuecke_ges,
                sum(case when Stueck.tonart Like '%-dur' then 1 else 0 end) as anz_tonart_dur,
                sum(case when Stueck.tonart Like '%-moll' then 1 else 0 end) as anz_tonart_moll
            From Komponist JOIN Stueck ON Komponist.knr = Stueck.knr
            GROUP BY Komponist.knr)
Select name,
        vorname,
        stuecke_ges,
        round((anz_tonart_dur*100.0)/stuecke_ges) as prozent_dur,
        round((anz_tonart_moll*100.0)/stuecke_ges) as prozent_moll
From Komponist JOIN gesamt on Komponist.knr = gesamt.knr
Where stuecke_ges >= 3
Group By name, vorname, stuecke_ges, anz_tonart_dur, anz_tonart_moll
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
LimDul Verständnisproblem warum em.flush() notwendig ist hier Datenbankprogrammierung 6
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
D MySQL Verständnisproblem mit globalen Variablen (Connection) Datenbankprogrammierung 7
S Verständnisproblem DAO Datenbankprogrammierung 5
S Verständnisproblem mit mehreren DAOs Datenbankprogrammierung 7
M JPA Verständnisproblem - persist(), merge(), getReference() Datenbankprogrammierung 15
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
J SQLite Abfrage fehlerhaft - komme nicht weiter - please help. Datenbankprogrammierung 3
L PostgreSQL Abfrage mit EclipseLink Datenbankprogrammierung 7
S Berechnung des Datumsunterschieds in der SQL-Abfrage Datenbankprogrammierung 1
Zrebna Probleme bei Überführung von SQL-Code in eine HQL-Abfrage Datenbankprogrammierung 3
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
nonickatall MySQL SQL Abfrage erneut ausführen oder rs aktualisieren Datenbankprogrammierung 14
N SQL-Abfrage in JTextField ausgeben Datenbankprogrammierung 6
N java sql abfrage bestimmer Datumszeitraum Datenbankprogrammierung 9
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Bluedaishi Datenbank Abfrage Datenbankprogrammierung 36
W MySQL DB Abfrage in Array, gemischte Array, generelles vorgehen Datenbankprogrammierung 4
D SQL Abfrage optimieren Datenbankprogrammierung 35
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
D Regelmäßige Abfrage aus Workbench Datenbankprogrammierung 6
M SQL-Statement Hilfe bei SQL-Abfrage Datenbankprogrammierung 2
D Abfrage - Spalte(Datum) ändern (Oracle) Datenbankprogrammierung 7
D Datenbank Abfrage Datenbankprogrammierung 7
H MySQL Benutzer Login System mit Datenbank Informationen (Abfrage zu User ist auf DB gesichert) Datenbankprogrammierung 42
D MySQL Abfrage mit kumulierten Werten Datenbankprogrammierung 16
M MySQL Anbindung und Abfrage an die Datenbank Datenbankprogrammierung 2
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
E Abfrage auf HSQLDB Datenbankprogrammierung 4
M MySQL SQL Abfrage in JTable mit Berechnung Datenbankprogrammierung 3
S Abfrage von Gruppentickets(Mehrere Resorts an einem Tag) Datenbankprogrammierung 1
S SQL Abfrage Datenbankprogrammierung 2
F Abfrage der letzten Einträge Datenbankprogrammierung 2
J SELECT Abfrage/Suche Datenbankprogrammierung 4
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
OnDemand SQL Abfrage und Equals Datenbankprogrammierung 4
B MySQL MySQL-Abfrage von aufsummierter Zeit Datenbankprogrammierung 3
M MySQL MySQLSyntaxError in Java, obwohl Abfrage in HeidiSQL korrekt Datenbankprogrammierung 2
ruutaiokwu sql abfrage mit rekursion, mit oder ohne cte... Datenbankprogrammierung 5
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
L JSONArray/JSONObject MySQL-Servlet Abfrage Datenbankprogrammierung 2
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
L SQL-Abfrage bricht vor dem Ende ab Datenbankprogrammierung 2
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
M Derby/JavaDB Komplexe Abfrage vereinfachen Datenbankprogrammierung 2
S SQL-Abfrage, Filewriter .txt Datei Datenbankprogrammierung 2
P Datenbank- Abfrage mit null'en Datenbankprogrammierung 2
Bluedaishi MySQL Abfrage Problem :-) Datenbankprogrammierung 21
D MySQL Erstellen der richtigen Abfrage Datenbankprogrammierung 3
D MySQL DB Abfrage Prüfen Datenbankprogrammierung 10
D JDBC insert mit select abfrage Datenbankprogrammierung 5
E PostgreSQL Exception too ...many clients already bei DB-Abfrage Datenbankprogrammierung 14
M MySQL SQL Abfrage Problem Datenbankprogrammierung 6
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
H JSON Array abfrage beschleunigen Datenbankprogrammierung 2
S MySQL Abfrage: Wenn Feld leer, alles anzeigen Datenbankprogrammierung 5
Mrtwomoon Abfrage-Ergebnisse in einem Fenster darstellen Datenbankprogrammierung 8
0 SQL Abfrage Bestellung Datenbankprogrammierung 15
G SQLite SQLite Abfrage Datenbankprogrammierung 4
C Mit jsp über Java eine DB Abfrage durchführen --> java.lang.ClassNotFoundException Datenbankprogrammierung 4
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
B My-SQL Abfrage - Out Of Memory Error Datenbankprogrammierung 13
C MySQL Problem mit UPDATE Abfrage Datenbankprogrammierung 13
K SQLite Einfache DB-Abfrage Datenbankprogrammierung 2
C Problem mit SQL-Abfrage Datenbankprogrammierung 5
C Sortierung bei SQL-Abfrage Datenbankprogrammierung 3
B Bei Abfrage schießt der Speicher in die Höhe Datenbankprogrammierung 6
M SQL Abfrage Dupliakte bei Kreuzvergleich Datenbankprogrammierung 2
M Access Abfrage mit Parameter & Access/Java liefern unterschiedliche Ergebnisse Datenbankprogrammierung 2
G SQL Abfrage Datenbankprogrammierung 5
C SQL-Abfrage Datenbankprogrammierung 4
B SQL-Abfrage Datenbankprogrammierung 4
R SQL Abfrage, je nach ausgewählten Parametern Datenbankprogrammierung 11
C Wert in SQL-Abfrage zählen lassen Datenbankprogrammierung 8
R Memory leaks bei DB Abfrage Datenbankprogrammierung 16
S Abfrage auf SQLite-DB Datenbankprogrammierung 2
I Belastet es das System zu sehr einen Timer jede 0.2 Sekunden eine DB Abfrage machen zu lassen? Datenbankprogrammierung 9
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
G Abfrage von Teilnehmern Datenbankprogrammierung 4
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
F MySQL SQL Abfrage für u.a. Spaltenname key Datenbankprogrammierung 4
G SQLite Abfrage, ob in Tabelle X Spalte Y existiert Datenbankprogrammierung 4
A MySQL Ergebnss aus SQL Abfrage in Hauptklasse verwenden Datenbankprogrammierung 3
N Geschwindigkeit bei if Abfrage Datenbankprogrammierung 11
J sql abfrage ... Problem mit Datumswert Datenbankprogrammierung 3
G Performante SQL- Abfrage (LIKE %) Datenbankprogrammierung 21
G Join Abfrage Datenbankprogrammierung 12
M db abfrage fehlerhaft Datenbankprogrammierung 5
C MySQL Abfrage mit flexibler WHERE bedingung Datenbankprogrammierung 10
C Datenbank-Abfrage, if im Select Datenbankprogrammierung 9
S MySQL Frage zu LeftJoin Abfrage Datenbankprogrammierung 2
G SQL Abfrage über mehrere Tabellen Datenbankprogrammierung 28
H SQL Abfrage - zwei tabellen vergleichen. Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben