Zum Inhalt springen

FIAE Sommer 2019- GA1-Aufgabe 5b


japp

Empfohlene Beiträge

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 von japp
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Tobeje
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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? 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

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?
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...