Antworten auf deine Fragen:
Neues Thema erstellen

Frage zu komplizierterer Abfrage

Fugel

rebmeM

PSD Beta Team
Hallo Leute,

ich bin gerade dabei eine etwas kompliziertere Abfrage in MySql zu schreiben und komme irgendwie nicht weiter. Vielleicht kann mir hier ja einer helfen!?

Ich habe zwei Tabellen, in der einen ist eine "jobid" und ein "Jobtype" hinterlegt, in der anderen "jobid" und "countersize". Verknüpft sind beide durch die jobid.

Bspl. der Tabelle 1:
jobidjobtype
11
22
32
42
52
61
Bspl. der Tabelle 2:

jobidcountersize
1g4
1g4
1g4
1g6
1g6
1g4
1g4
2g4
2g6
2g4
2g4
Ich möchte mir nun auf meiner Seite gern die Summe der Spalte countersize gruppiert nach dieser anzeigen lassen, dabei soll es aber getrennt nach jobtype sein.
Bspl. der Finalen Tabelle:
countersizejobtype 1jobtype 2
g453
g621
Wie kann ich eine Solche Abfrage gestalten? Ich denke mit Inner Join ist klar, aber eben nicht wie ich mir jobtype 1 und 2 trenne. Ich hoffe das ist einigermaßen verständlich erklärt. Danke schon mal für die Hilfe.
 

Stefan

Administrator

Teammitglied
Ich habe mal exakt deine Frage bei chat gpt eingetragen. Das kam bei raus:

Um die Summe der Spalte countersize gruppiert nach jobtype anzuzeigen, können Sie eine Abfrage verwenden, die JOIN verwendet, um die beiden Tabellen zu verbinden, und dann GROUP BY verwendet, um die Ergebnisse nach jobtype zu gruppieren. Hier ist ein Beispiel für eine solche Abfrage:

SQL:
SELECT t1.jobtype, t2.countersize, SUM(t2.countersize)
FROM tabelle1 t1
JOIN tabelle2 t2 ON t1.jobid = t2.jobid
GROUP BY t1.jobtype, t2.countersize

Diese Abfrage verbindet die beiden Tabellen anhand der jobid und gruppiert dann die Ergebnisse nach jobtype und countersize. Die SUM-Funktion wird verwendet, um die Summe der Spalte countersize zu berechnen.

Um die Ergebnisse für jeden Jobtyp in separaten Spalten anzuzeigen, kannst du eine bedingte Aggregatfunktion verwenden (CASE WHEN)

SQL:
SELECT 
t2.countersize, 
SUM(CASE WHEN t1.jobtype = 1 THEN t2.countersize ELSE 0 END) as jobtype_1,
SUM(CASE WHEN t1.jobtype = 2 THEN t2.countersize ELSE 0 END) as jobtype_2
FROM tabelle1 t1
JOIN tabelle2 t2 ON t1.jobid = t2.jobid
GROUP BY t2.countersize


Hoffe das hilft, lass es mich wissen, falls du noch Fragen hast.
 

Fugel

rebmeM

PSD Beta Team
Danke für deine Antwort. Ich habe es mal versucht, aber irgendwie ist das Ergebnis nicht richtig, ich bekomme überall nur 0 angezeigt wo aber Daten da sein sollten.
Hier mal meine Finale Abfrage:
SQL:
SELECT t2.counter_size,
SUM(CASE WHEN t1.job_type = 0 THEN t2.counter_size ELSE 0 END) AS jobtype_0,
SUM(CASE WHEN t1.job_type = 1 THEN t2.counter_size ELSE 0 END) AS jobtype_1,
SUM(CASE WHEN t1.job_type = 2 THEN t2.counter_size ELSE 0 END) AS jobtype_2,
SUM(CASE WHEN t1.job_type = 3 THEN t2.counter_size ELSE 0 END) AS jobtype_3,
SUM(CASE WHEN t1.job_type = 4 THEN t2.counter_size ELSE 0 END) AS jobtype_4
FROM jobs t1
JOIN counter t2 ON t1.job_id = t2.counter_proof_job_id
WHERE DATE_FORMAT(counter_formated_proof_time, '%Y') = 2021
            AND t2.counter_counter_id NOT BETWEEN 1000 AND 1012
      GROUP BY t2.counter_size, t1.job_type

So sieht dann das Ergebnis aus:

counter_sizejobtype_0jobtype_1jobtype_2jobtype_3jobtype_4
00000
G1000000
G1600000
G1600000
G16 600000
G200000
G2500000
G400000
G400000
G400000
G4000000
G4000000
G600000
G600000
G600000
G6500000
Ich sehe auch gerade, das die Inhalte der Spalte counter_size nicht richtig gruppiert werden.

Hast du eine Idee was da Falsch ist?
 
Zuletzt bearbeitet:

Stefan

Administrator

Teammitglied
Es sieht so aus, als ob die Ergebnisse der Abfrage nicht die erwarteten sind. Ein mögliches Problem könnte sein, dass die Spalte "counter_size" in der Tabelle "counter" entweder leer oder NULL ist, was dazu führt, dass die SUM-Funktion 0 zurückgibt. Ich würde empfehlen, die Daten in der Tabelle "counter" zu überprüfen, um sicherzustellen, dass die Spalte "counter_size" gefüllt ist und die richtigen Daten enthält.

Ein anderer Fehler könnte sein, dass die Vergleiche in der Abfrage nicht richtig sind. In Ihrer Abfrage,
SQL:
WHERE DATE_FORMAT(counter_formated_proof_time, '%Y') = 2021

Es scheint, dass Sie nur die Daten aus dem Jahr 2021 auswählen möchten, aber es gibt keine Vergleichsoperation in der SELECT-Klausel für die Spalte 'counter_size'

Ein weiteres Problem könnte sein, dass in der JOIN-Klausel die Spaltennamen nicht übereinstimmen oder es könnte Probleme beim Verbinden der Tabellen geben. Ich empfehle Ihnen, die JOIN-Klausel noch einmal zu überprüfen und sicherzustellen, dass die verknüpften Spalten in beiden Tabellen übereinstimmen und dass es keine Schreibfehler gibt.

SQL:
JOIN counter t2 ON t1.job_id = t2.counter_proof_job_id
Es kann auch sein, dass es Probleme bei der Datenkonvertierung gibt, insbesondere bei der Verwendung der DATE_FORMAT-Funktion. Stellen Sie sicher, dass die Spalte "counter_formated_proof_time" in der Tabelle "counter" ein gültiges Datumsformat hat und dass das Format mit dem Format in der Abfrage übereinstimmt.

Ich hoffe, dass diese Hinweise helfen, das Problem zu lösen. Wenn Sie weitere Fragen haben, zögern Sie bitte nicht, mich erneut zu kontaktieren.
 

Fugel

rebmeM

PSD Beta Team
Na das war aber jetzt ne 1 zu 1 Kopie vom chat opg ;) Also was mir jetzt selbst erstmal aufgefallen ist, ist dass es nicht SUM sondern COUNT sein muss, da ich ja die Anzahl der Datensätze Zählen möchte, da habe ich mich vielleicht etwas falsch ausgedrückt (Sorry). Das habe ich soweit korrigiert und nun bekomme ich auch was angezeigt. Alledings hab ich nun in jeder Spalte die gleiche Zahl drin stehen:


counter_sizejobtype_0jobtype_1jobtype_2jobtype_3jobtype_4
127127127127127
55555
G1077777
G1011111
G1666666
G1622222
G1611111
G16 101010101010
G16 611111
G255555
G2,57878787878
G2,511111
G2511111
G2522222
G426642664266426642664
G4135135135135135
G4 / Anschluss 1"4949494949
G4 1,222222
G4 2,0226226226226226
G4 2,06464646464
G4 2,066666
G40 16,811111
G65555555555
G62121212121
G6 2,05151515151
Und richtig gruppiert ist es irgendwie immer noch nicht.
 

Stefan

Administrator

Teammitglied
Es sieht so aus, als ob das Problem, das Sie beschreiben, durch einen Fehler in der GROUP BY-Klausel verursacht wird. In Ihrer Abfrage gruppieren Sie Ihre Ergebnisse nur nach der Spalte "counter_size" und "job_type", aber Sie sollten auch die anderen Spalten in der SELECT-Klausel in die GROUP BY-Klausel einbeziehen.

Ich würde empfehlen, die Abfrage wie folgt zu ändern:

SQL:
SELECT t2.counter_size, t1.job_type, COUNT(*) as Anzahl
FROM jobs t1
JOIN counter t2 ON t1.job_id = t2.counter_proof_job_id
WHERE DATE_FORMAT(counter_formated_proof_time, '%Y') = 2021
            AND t2.counter_counter_id NOT BETWEEN 1000 AND 1012
GROUP BY t2.counter_size, t1.job_type
ORDER BY t2.counter_size, t1.job_type

In dieser Abfrage selektieren Sie die Spalten "counter_size", "job_type" und die Anzahl der Datensätze. Sie gruppieren die Ergebnisse nach den Spalten "counter_size" und "job_type" und sortieren sie aufsteigend nach "counter_size" und "job_type".

Es gibt auch noch ein Fehler in der WHERE Klausel:
SQL:
WHERE DATE_FORMAT(counter_formated_proof_time, '%Y') = 2021

Wie gesagt, das sind alles Antworten von chat gpt. Probiere es dort sonst mal weiter ... ich bin jetzt off :)
 

Fugel

rebmeM

PSD Beta Team
Danke für deine Hilfe, hab es jetzt soweit hinbekommen das es läuft. Was mir aber noch nicht gefällt ist, dass z.B. G4 3 oder 4 mal da steht und nicht als eine Zeile zusammengefasst wird. hast du eine Idee wie ich das noch bewerkstelligen kann?
Hier mein Code und die Ausgabe:

SQL:
SELECT t2.counter_size, t1.job_type, COUNT(*) as amount
      FROM jobs t1
      JOIN counter t2 ON t1.job_id = t2.counter_proof_job_id
      WHERE DATE_FORMAT(counter_formated_proof_time, '%Y') = 2022
      AND t2.counter_counter_id NOT BETWEEN 1000 AND 1012
      GROUP BY t2.counter_size, t1.job_type
      ORDER BY t2.counter_size, t1.job_type DESC

Die Ausgabe:
G250210000
G258000000
G4000002
G4000158300
G400570000
G4059250000
G41464700000

Schöner wäre es aber so:

G2580210000
G4146475925570158302
 

Stefan

Administrator

Teammitglied
Um die Ausgabe so zusammenzufassen, dass jede Größe (z.B. G4) nur einmal angezeigt wird, kannst du die SUM()-Funktion verwenden. Statt COUNT(*) kannst du dann SUM(t1.job_type) verwenden, um die Anzahl der Jobs pro Typ zusammenzufassen. Hier ist ein Beispiel für den geänderten Code:


SQL:
SELECT t2.counter_size, SUM(t1.job_type) as amount
FROM jobs t1
JOIN counter t2 ON t1.job_id = t2.counter_proof_job_id
WHERE DATE_FORMAT(counter_formated_proof_time, '%Y') = 2022
AND t2.counter_counter_id NOT BETWEEN 1000 AND 1012
GROUP BY t2.counter_size
ORDER BY t2.counter_size DESC

Hiermit werden die Jobs pro Typ für jede Größe zusammengefasst und die Größe wird nur einmal angezeigt.
 

Myhar

Hat es drauf

War das jetzt die Werbung dafür, dass das Forum nicht mehr benötigt wird und man am Besten direkt zu chat gpt gehen soll? :-D
 

Stefan

Administrator

Teammitglied
Nein nein, das nicht. Es ist ein Test, wie schlau die KI wirklich ist. Da keiner bisher hier helfen konnte, habe ich zum Testen mal chat gpt angeschmissen. Ich habe aber selbst bei einigen Fragen gesehen, dass die Antworten teilweise komplett falsch waren, aber andere widerum komplett richtig. Daher ist es eine gute Hilfe/Ergänzung, wenn sonst keiner eine Antwort weiß.
 

Fugel

rebmeM

PSD Beta Team
Um die Ausgabe so zusammenzufassen, dass jede Größe (z.B. G4) nur einmal angezeigt wird, kannst du die SUM()-Funktion verwenden. Statt COUNT(*) kannst du dann SUM(t1.job_type) verwenden, um die Anzahl der Jobs pro Typ zusammenzufassen. Hier ist ein Beispiel für den geänderten Code:


SQL:
SELECT t2.counter_size, SUM(t1.job_type) as amount
FROM jobs t1
JOIN counter t2 ON t1.job_id = t2.counter_proof_job_id
WHERE DATE_FORMAT(counter_formated_proof_time, '%Y') = 2022
AND t2.counter_counter_id NOT BETWEEN 1000 AND 1012
GROUP BY t2.counter_size
ORDER BY t2.counter_size DESC

Hiermit werden die Jobs pro Typ für jede Größe zusammengefasst und die Größe wird nur einmal angezeigt.
Die Ergebnisse stimmen mit diesem Code überhaupt nicht. Hier wird wie zu wenig gezählt.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.611
Beiträge
1.538.341
Mitglieder
67.524
Neuestes Mitglied
BSKGA
Oben