japp Geschrieben 17. November 2019 Geschrieben 17. November 2019 (bearbeitet) Hallo, Kann mir jemand erklären wie diese Aufgabe zu lösen ist. Mir ist nicht klar was in Laufzeit.Stunden steht. Die Gesamtlaufzeit seit inbetriebnahme der Maschine, aber wie berechnet man dann die Laufzeit seit der letzten Wartung, da ja nur ein Datum aber keine Uhrzeit dazu gegeben ist und die Information fehlt, ob die Maschinen 24/7 laufen ? Bearbeitet 17. November 2019 von japp Zitieren
Thanks-and-Goodbye Geschrieben 17. November 2019 Geschrieben 17. November 2019 Nicht jeder hat die Fragensätze vorliegen, bitte also die ursprüngliche Frage aus der Prüfung zitieren. Visar reagierte darauf 1 Zitieren
Tobeje Geschrieben 19. November 2019 Geschrieben 19. November 2019 (bearbeitet) Ich glaube bei der Aufgabe ist die Information ob du Maschinen 24/7 laufen unwichtig, wichtig hierbei ist wann die letzten Wartung war und wie hoch die Laufzeit ist nach diesem Datum der Letzten Wartung. Ich habe die Aufgabe wie folgt gelöst weiß aber leider auch nicht ob das Richtig ist: SELECT k.KundeID, k.KundeFirma, k.KundeAdresse, m.MaschineID, l.Laufzeit FROM Kunde as k LEFT JOIN Maschine as m on m.KundeID = k.KundeID LEFT JOIN Maschinentyp as mt on m.MaschineTypeID = mt.MaschineTypeID LEFT JOIN Laufzeit as l on l.MaschineID = m.MaschineID WHERE m.DatumLetzteWartung <= l.Datum AND (mt.WartungsIntervallInStunden - l.Stunden) <= 100 btw wenn jemand die Lösung für die Komplette GA1 2019 hat kann er sie mir bitte zusenden Gruß Marcel Bearbeitet 19. November 2019 von Tobeje japp reagierte darauf 1 Zitieren
japp Geschrieben 19. November 2019 Autor Geschrieben 19. November 2019 vor 4 Stunden schrieb Tobeje: SELECT k.KundeID, k.KundeFirma, k.KundeAdresse, m.MaschineID, l.Laufzeit FROM Kunde as k LEFT JOIN Maschine as m on m.KundeID = k.KundeID LEFT JOIN Maschinentyp as mt on m.MaschineTypeID = mt.MaschineTypeID LEFT JOIN Laufzeit as l on l.MaschineID = m.MaschineID WHERE m.DatumLetzteWartung <= l.Datum AND (mt.WartungsIntervallInStunden - l.Stunden) <= 100 Bei deiner Lösung muss man dann davon ausgehen das Laufzeit.Stunden, die Stunden seit der letzten Wartung sind. Es könnte aber auch die Gesamtlaufzeit sei inbetriebnahme gemeint sein. Zitieren
Tobeje Geschrieben 20. November 2019 Geschrieben 20. November 2019 Ich glaube das stände dann da beschrieben, ansonsten würde die Abfrage um einiges Komplizierter werden. Aber Vielleicht ja jemand anders noch eine Lösung dafür? Zitieren
Prophet_of_Kruphix Geschrieben 21. November 2019 Geschrieben 21. November 2019 Sicher richtige Lösung aus Quellen: SELECT K. KundeID, K.KundeFirma, K.KundeAdresse, M.MaschineId, (SELECT SUM(L.Stunden) FROM Laufzeit AS L WHERE L.MaschineID = M.MaschineID AND L.Datum > M.DatumLetzteWartung ) AS Laufzeit FROM Kunde AS K JOIN Maschine AS M ON K.KundeID = M.KundeID JOIN Maschinentyp AS MT ON M.MaschineTypID = MT.MaschineTypID WHERE (SELECT SUM (L.Stunden) FROM Laufzeit AS L WHERE L.MaschineID = M.MaschineID AND L.Datum > M.DatumLetzteWartung ) +100 > MT.WartungsintervallInStunedn; Zitieren
Tobeje Geschrieben 22. November 2019 Geschrieben 22. November 2019 vor 16 Stunden schrieb Prophet_of_Kruphix: Sicher richtige Lösung aus Quellen: SELECT K. KundeID, K.KundeFirma, K.KundeAdresse, M.MaschineId, (SELECT SUM(L.Stunden) FROM Laufzeit AS L WHERE L.MaschineID = M.MaschineID AND L.Datum > M.DatumLetzteWartung ) AS Laufzeit FROM Kunde AS K JOIN Maschine AS M ON K.KundeID = M.KundeID JOIN Maschinentyp AS MT ON M.MaschineTypID = MT.MaschineTypID WHERE (SELECT SUM (L.Stunden) FROM Laufzeit AS L WHERE L.MaschineID = M.MaschineID AND L.Datum > M.DatumLetzteWartung ) +100 > MT.WartungsintervallInStunedn; Bist du dir da sicher? In der SQL Syntax(Auszug) von der IHK gibt es kein "JOIN" befehl sondern nur die Standard Join befehle (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN). Ich denke mal man sollte schon die Syntax von der IHK verwenden. Das mit der Summe der Stunden ist halt auch wieder Definition Sache was oder wie in der Datenbank abgespeichert ist und das ist leider nicht beschrieben. Woher soll man wissen ob es die Summe alle Laufzeiten nach der Letzten Wartung ist? Zitieren
Visar Geschrieben 22. November 2019 Geschrieben 22. November 2019 Könnten wir jetzt bitte einmal die Aufgabe selbst posten? Danke. Zitieren
Finux Geschrieben 22. November 2019 Geschrieben 22. November 2019 vor 25 Minuten schrieb Tobeje: Bist du dir da sicher? In der SQL Syntax(Auszug) von der IHK gibt es kein "JOIN" befehl sondern nur die Standard Join befehle (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN). Ich denke mal man sollte schon die Syntax von der IHK verwenden. Das mit der Summe der Stunden ist halt auch wieder Definition Sache was oder wie in der Datenbank abgespeichert ist und das ist leider nicht beschrieben. Woher soll man wissen ob es die Summe alle Laufzeiten nach der Letzten Wartung ist? Hier die Lösung: b) SELECT K.KundeID, K.KundeFirma, K.KundeAdresse, M.MaschineID, (SELECT SUM(L.Stunden) FROM Laufzeit AS L WHERE L.MaschineID = M.MaschineID AND L.Datum > M.DatumLetzteWartung) AS Laufzeit FROM Kunde AS K INNER JOIN Maschine AS M ON K.KundeID = M.KundeID INNER JOIN MaschineTyp AS MT ON M.MaschineTypID = MT.MaschineTypID WHERE (SELECT SUM(L.Stunden) FROM Laufzeit AS L WHERE L.MaschineID = M.MaschineID AND L.Datum > M.DatumLetzteWartung) + 100 > MT.WartungsintervallInStunden; Tobeje reagierte darauf 1 Zitieren
Finux Geschrieben 22. November 2019 Geschrieben 22. November 2019 Wenn ich mich hier anschließen darf (es betrifft dieselbe Aufgabe), bin mir nicht sicher ob meine Lösung akzeptiert werden würde und ob sie überhaupt funktioniert? Meine eigene Lösung sieht so aus: SELECT * (SELECT Laufzeit.Stunden AS Laufzeit FROM Laufzeit WHERE Laufzeit.MaschineID = Maschine.MaschineID AND Laufzeit.Stunden / Maschinentyp.WartungsintervallInStunden > 100 AND Maschinentyp.MaschineTypID = Maschine.MaschineTypID) FROM Kunde WHERE Kunde.KundeID = Maschine.KundeID AND Maschine.DatumLetzteWartung < DATE(TODAY-4); Ich vermute, dass meine Lösung falsch ist, aber wie gehe ich in "meinem Stil" (z.B. ohne das Nutzen von JOINS) an? Und wo liegen meine Fehler? LG Zitieren
Tobeje Geschrieben 22. November 2019 Geschrieben 22. November 2019 vor 4 Minuten schrieb Finux: Wenn ich mich hier anschließen darf (es betrifft dieselbe Aufgabe), bin mir nicht sicher ob meine Lösung akzeptiert werden würde und ob sie überhaupt funktioniert? Meine eigene Lösung sieht so aus: SELECT * (SELECT Laufzeit.Stunden AS Laufzeit FROM Laufzeit WHERE Laufzeit.MaschineID = Maschine.MaschineID AND Laufzeit.Stunden / Maschinentyp.WartungsintervallInStunden > 100 AND Maschinentyp.MaschineTypID = Maschine.MaschineTypID) FROM Kunde WHERE Kunde.KundeID = Maschine.KundeID AND Maschine.DatumLetzteWartung < DATE(TODAY-4); Ich vermute, dass meine Lösung falsch ist, aber wie gehe ich in "meinem Stil" (z.B. ohne das Nutzen von JOINS) an? Und wo liegen meine Fehler? LG Also bei deiner Lösung fehlt schon mal die MaschineID das würde denke mal Punktabzug geben und warum DATE(Today-4)? Es gibt ja extra die spalte Datum bei Laufzeit. Ansonsten fehlt von der "Lösung" die Summe der Laufzeit, wobei ich mich hier noch immer frage es steht nirgends beschrieben, wie die Laufzeit abgespeichert wird. Es kann ja auch sein das es so ist wie wir es uns denken in Laufzeit wird immer der Aktuelle Wert abgespeichert oder man muss es wirklich zusammenrechen. Dies ist in der Aufgabe aber nicht richtig Definiert. Finux reagierte darauf 1 Zitieren
Prophet_of_Kruphix Geschrieben 22. November 2019 Geschrieben 22. November 2019 Also Die Laufzeit hat ein Datum mit im Table. Es wird also immer die Stunden gespeichert die die Maschine an einem bestimmten Tag gelaufen ist, ansonsten macht das Feld keinen sinn und es wäre keine 3 Normalform. und zu vor einer Stunde schrieb Tobeje: Bist du dir da sicher? In der SQL Syntax(Auszug) von der IHK gibt es kein "JOIN" befehl sondern nur die Standard Join befehle (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN). Ich denke mal man sollte schon die Syntax von der IHK verwenden. Das mit der Summe der Stunden ist halt auch wieder Definition Sache was oder wie in der Datenbank abgespeichert ist und das ist leider nicht beschrieben. Woher soll man wissen ob es die Summe alle Laufzeiten nach der Letzten Wartung ist? Ein JOIN ist das gleiche wie ein INNER JOIN. Die Lösung ist (bis auf das ich das INNER bei den Joins weggelassen hab) so von der IHK vorgegeben. Finux reagierte darauf 1 Zitieren
Whiz-zarD Geschrieben 22. November 2019 Geschrieben 22. November 2019 (bearbeitet) SELECT Kunde.*, Maschine.MaschineID, Laufzeit.Stunden FROM Kunde INNER JOIN Maschine ON Maschine.KundeID = Kunde.KundeID INNER JOIN MaschinenTyp ON MaschinenTyp.MaschineTypID = Maschine.MaschineTypID INNER JOIN ( SELECT Laufzeit.MaschineID, SUM(Laufzeit.Stunden) AS Stunden FROM Laufzeit INNER JOIN Maschine ON Maschine.MaschineID = Laufzeit.MaschineID WHERE Laufzeit.Datum > Maschine.DatumLetzteWartung GROUP BY Laufzeit.MaschineID ) Laufzeit ON Laufzeit.MaschineID = Maschine.MaschineID WHERE Laufzeit.Stunden + 100 > MaschinenTyp.WartungsintervallInStunden Bearbeitet 22. November 2019 von Whiz-zarD Zitieren
Finux Geschrieben 22. November 2019 Geschrieben 22. November 2019 Also eine Möglichkeit die Aufgabe ohne *JOIN zu lösen gibt es hier nicht? Zitieren
Whiz-zarD Geschrieben 22. November 2019 Geschrieben 22. November 2019 (bearbeitet) Nein, da du ja Daten aus anderen Tabellen benötigst und die Daten musst du mittels Joins holen. Du willst doch in deiner Abfrage auch Tabellen joinen: vor 4 Stunden schrieb Finux: SELECT * (SELECT Laufzeit.Stunden AS Laufzeit FROM Laufzeit WHERE Laufzeit.MaschineID = Maschine.MaschineID AND Laufzeit.Stunden / Maschinentyp.WartungsintervallInStunden > 100 AND Maschinentyp.MaschineTypID = Maschine.MaschineTypID) FROM Kunde WHERE Kunde.KundeID = Maschine.KundeID AND Maschine.DatumLetzteWartung < DATE(TODAY-4); Wo soll denn plötzlich Maschine und Maschinentyp herkommen, wenn nicht über Joins? Bearbeitet 22. November 2019 von Whiz-zarD Zitieren
Prophet_of_Kruphix Geschrieben 22. November 2019 Geschrieben 22. November 2019 vor 58 Minuten schrieb Whiz-zarD: SELECT Kunde.*, Maschine.MaschineID, Laufzeit.Stunden FROM Kunde INNER JOIN Maschine ON Maschine.KundeID = Kunde.KundeID INNER JOIN MaschinenTyp ON MaschinenTyp.MaschineTypID = Maschine.MaschineTypID INNER JOIN ( SELECT Laufzeit.MaschineID, SUM(Laufzeit.Stunden) AS Stunden FROM Laufzeit INNER JOIN Maschine ON Maschine.MaschineID = Laufzeit.MaschineID WHERE Laufzeit.Datum > Maschine.DatumLetzteWartung GROUP BY Laufzeit.MaschineID ) Laufzeit ON Laufzeit.MaschineID = Maschine.MaschineID WHERE Laufzeit.Stunden + 100 > MaschinenTyp.WartungsintervallInStunden DU musst die Stunden Summieren, es sind immer nur die Anzahl Stunden pro Datum. dein Lösungsansatz ist so also falsch. warum machst du den Sum im Where aber im Select nicht? @Whi-zarD Zitieren
Whiz-zarD Geschrieben 22. November 2019 Geschrieben 22. November 2019 (bearbeitet) vor 21 Minuten schrieb Prophet_of_Kruphix: DU musst die Stunden Summieren, es sind immer nur die Anzahl Stunden pro Datum. dein Lösungsansatz ist so also falsch. warum machst du den Sum im Where aber im Select nicht? @Whi-zarD Die Stunden werden summiert. Die Unterabfrage: SELECT Laufzeit.MaschineID, SUM(Laufzeit.Stunden) AS Stunden FROM Laufzeit INNER JOIN Maschine ON Maschine.MaschineID = Laufzeit.MaschineID WHERE Laufzeit.Datum > Maschine.DatumLetzteWartung GROUP BY Laufzeit.MaschineID Gibt als Ergebnis die summierten Stunden pro Maschine, wo das Datum größer als das Datum der letzten Wartung ist. Beispiel: Folgende Daten sind gegeben: Laufzeit: MaschineID Datum Laufzeit 1 31.10.2019 5 1 20.11.2019 4 1 21.11.2019 8 Maschine: MaschineID MaschineTypID DatumLetzteWartung 1 1 01.11.2019 Die Abfrage würde nun folgendes Ergebnis liefern: MaschineID Stunden 1 12 Der Datensatz mit den 5 Stunden wird außer Acht gelassen, weil das Datum kleiner als das Datum der letzten Wartung ist und somit keine Rolle mehr spielt. vor 18 Minuten schrieb Prophet_of_Kruphix: warum machst du den Sum im Where aber im Select nicht? @Whi-zarD Die Aufgabe war, dass man herausfinden soll, welche Maschine gewartet werden muss, wenn sie noch 100 Stunden benutzt wird. Also muss man auf die derzeitige Nutzung 100 Stunden drauf addieren und diesem Wert den Wartungsintervall vergleichen. Bearbeitet 22. November 2019 von Whiz-zarD Zitieren
Prophet_of_Kruphix Geschrieben 22. November 2019 Geschrieben 22. November 2019 vor einer Stunde schrieb Whiz-zarD: Die Stunden werden summiert. Die Unterabfrage: SELECT Laufzeit.MaschineID, SUM(Laufzeit.Stunden) AS Stunden FROM Laufzeit INNER JOIN Maschine ON Maschine.MaschineID = Laufzeit.MaschineID WHERE Laufzeit.Datum > Maschine.DatumLetzteWartung GROUP BY Laufzeit.MaschineID Gibt als Ergebnis die summierten Stunden pro Maschine, wo das Datum größer als das Datum der letzten Wartung ist. Beispiel: Folgende Daten sind gegeben: Laufzeit: MaschineID Datum Laufzeit 1 31.10.2019 5 1 20.11.2019 4 1 21.11.2019 8 Maschine: MaschineID MaschineTypID DatumLetzteWartung 1 1 01.11.2019 Die Abfrage würde nun folgendes Ergebnis liefern: MaschineID Stunden 1 12 Der Datensatz mit den 5 Stunden wird außer Acht gelassen, weil das Datum kleiner als das Datum der letzten Wartung ist und somit keine Rolle mehr spielt. Die Aufgabe war, dass man herausfinden soll, welche Maschine gewartet werden muss, wenn sie noch 100 Stunden benutzt wird. Also muss man auf die derzeitige Nutzung 100 Stunden drauf addieren und diesem Wert den Wartungsintervall vergleichen. Ah ich sehe grad ich hab mich verlesen. Dachte du machst dein SUM nur im äußeren WHERE. Bei dem SUM im JOIN wird die Stunden Property von Laufzeit "Überschrieben", so dass in jedem LaufzeitObjekt die Stunden Property gleich der Gesamtzahl ist oder? Zitieren
Whiz-zarD Geschrieben 22. November 2019 Geschrieben 22. November 2019 vor 2 Minuten schrieb Prophet_of_Kruphix: Ah ich sehe grad ich hab mich verlesen. Dachte du machst dein SUM nur im äußeren WHERE. Bei dem SUM im JOIN wird die Stunden Property von Laufzeit "Überschrieben", so dass in jedem LaufzeitObjekt die Stunden Property gleich der Gesamtzahl ist oder? Sie wird nicht überschrieben. Mit dem Unterselect baue ich mir quasi eine neue Tabelle und in dieser verwende ich lediglich die selben Begriffe, wie in der Laufzeit-Tabelle. Man könnte auch das Unterselect in eine View packen und die View joinen. Zitieren
Prophet_of_Kruphix Geschrieben 22. November 2019 Geschrieben 22. November 2019 Das is das was ich meinte. Passt sehr gut. Zitieren
BobbyJean Geschrieben 24. November 2019 Geschrieben 24. November 2019 Am 21.11.2019 um 16:32 schrieb Prophet_of_Kruphix: Sicher richtige Lösung aus Quellen: SELECT K. KundeID, K.KundeFirma, K.KundeAdresse, M.MaschineId, (SELECT SUM(L.Stunden) FROM Laufzeit AS L WHERE L.MaschineID = M.MaschineID AND L.Datum > M.DatumLetzteWartung ) AS Laufzeit FROM Kunde AS K JOIN Maschine AS M ON K.KundeID = M.KundeID JOIN Maschinentyp AS MT ON M.MaschineTypID = MT.MaschineTypID WHERE (SELECT SUM (L.Stunden) FROM Laufzeit AS L WHERE L.MaschineID = M.MaschineID AND L.Datum > M.DatumLetzteWartung ) +100 > MT.WartungsintervallInStunedn; Spricht was dagegen in der Unterabfrage einen Join zu verwenden? Für mich ist das irgendwie ungewohnt mit "where" statt "join" zu arbeiten: SELECT Kunde.KundeID, Kunde.KundeFirma, Kunde.KundeAdresse, Maschine.MaschineId, (SELECT SUM(Laufzeit.Stunden) FROM Laufzeit INNER JOIN Maschine on Laufzeit.MaschineID = Maschine.MaschineID WHERE Laufzeit.Datum > Maschine.DatumLetzteWartung ) AS Laufzeit FROM Kunde INNER JOIN Maschine ON Kunde.KundeID = Maschine.KundeID INNER JOIN Maschinentyp ON Maschine.MaschineTypID = Maschinentyp.MaschineTypID WHERE (SELECT SUM (Laufzeit.Stunden) FROM Laufzeit WHERE Laufzeit.MaschineID = Maschine.MaschineID AND Laufzeit.Datum > Maschine.DatumLetzteWartung ) +100 > Maschinentyp.WartungsintervallInStunedn; Zitieren
Whiz-zarD Geschrieben 24. November 2019 Geschrieben 24. November 2019 @BobbyJean: Deine Lösung ist nicht richtig. Dein Unterselect SELECT SUM(Laufzeit.Stunden) FROM Laufzeit INNER JOIN Maschine on Laufzeit.MaschineID = Maschine.MaschineID WHERE Laufzeit.Datum > Maschine.DatumLetzteWartung Summiert die Stunden aller Maschinen und nicht die Stunden der einzelnen Maschinen. Ich persönlich bin auch kein Freund davon, zwei mal die selbe Unterabfrage in der SELECT- und WHERE-Klausel einzubauen. Es ist doppelter Code und schlechter lesbar und das heißt schlechter wartbar und mehr fehleranfällig. In diesem Fall ist es sogar so, dass man doch Daten gruppieren möchte. Wieso wird das dann nicht gemacht? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.