MYSQL Abfrage bereitet mir Probleme
Hallo Leute,
ich habe wieder ein Problem mit einer SQL Abfrage.
Ich habe eine Tabelle die nennt sich pbooking, darin sind die folgenden Felder für die Abfrage relevant:
ladedatum (ist klar denke ich)
tour_nr (Auftragsnummer)
ladestelle (enthält die Kundennummer der Ladestelle)
lds_geladen (enthält die Anzahl der geladenen Paletten)
lds_entladen (enthält die Anzahl der zurückgegebenen Paletten)
entladestelle (enthält die Kundennummer der Entladestelle)
els_geladen (enthält die Anzahl der geladenen Paletten)
els_entladen (enthält die Anzahl der agegebenen Paletten)
lds_beleg_nr (ist klar denke ich)
els_beleg_nr (ist klar denke ich)
lds_bemerkung (ist klar denke ich)
els_bemerkung (ist klar denke ich)
stockbooking (wert ob die Buchung eine Tour oder Lagerbuchung ist. Nur relevant für die Sortierung)
Mit den o.g. Feldern muss ein sogenannter Packmittelkontoausdruck für einen Kunden oder einen Unternehmer generiert werden. Der Kunde bzw. Unternehmer kann sowohl die Ladestelle als auch die Entladestelle sein. Beides muss jedoch auf einem Ausdruck stehen und auf dem Ausdruck gibt es nur die Spalten geladen und entladen.
Wenn er Ladestelle ist müssen die Felder lds_geladen sowie lds_entladen abgefragt werden, wenn er Entladestelle ist els_geladen und els_entladen.
Quasi sollte es auf dem Ausdruck dann z.B. so aussehen bei den Spalten geladen und entladen:
geladen entladen
wert:lds_geladen wert:lds_entladen (hier ist er Ladestelle)
wert:els_geladen wert:els_entladen (hier ist er Entladestelle)
wert:lds_geladen wert:lds_entladen (hier ist er wieder Ladestelle) usw. usw.
Jetzt noch die Summen der Spalten geladen und entladen auf dem Ausdruck. Ok.
Jetzt kommt das was mir richtig probleme bereitet. Aus den Summen muss die Differenz berechnet werden. Wenn er Ladestelle ist wird die Differenz errechnet aus lds_geladen - lds_entladen, wenn er Entladestelle ist wird die Differenz aus els_entladen - els_geladen errechnet. Jetzt kann es sein das er in einem Monat mal nur Ladestelle war oder nur Entladestelle. Er kann aber auch beides gewesen sein. Bei meinem SQL stimmen die Summen nie.
Hier das was ich gemacht habe. Aber ich hab mittlerweile so einen Knoten im Kopf, ich brauche eure Hilfe:
Gehen wir davon aus das die Kundennummer 80000 ist und diese befindet sich in $ident.
$query = "SELECT
ladedatum AS Ladedatum,
tour_nr AS 'Tour-Nr',
if (ladestelle ='$ident',lds_geladen,els_geladen) AS geladen,
if (ladestelle ='$ident',lds_entladen,els_entladen) AS entladen,
if (ladestelle !='$ident',lds_beleg_nr,els_beleg_nr) AS 'Beleg Nr',
if (ladestelle !='$ident',lds_bemerkung,els_bemerkung) AS 'Bemerkung',
stockbooking
FROM pbooking
WHERE (ladestelle = ".$ident." OR entladestelle = ".$ident.") AND (palart='".$part."') AND (deleted !=1) ORDER BY stockbooking = '1' DESC, ladedatum"
";
Das gibt mir schon mal die Spalten korrekt auf dem Ausdruck aus. Jetzt folgt das SQL für die Berechnungen:
SELECT "
. "sum(if (ladestelle ='".$ident."',lds_geladen,els_geladen)) ,"
. "sum(if(ladestelle ='".$ident."', lds_entladen, els_entladen)) ,"
. "if(ladestelle = ".$ident.",sum(if(ladestelle ='$ident', lds_geladen, els_geladen))-sum(if(ladestelle ='$ident', lds_entladen, els_entladen)), "
. "sum(if(ladestelle ='$ident', lds_i_entladen, els_i_entladen))-sum(if(ladestelle ='$ident', lds_i_geladen, els_i_geladen))) "
. "FROM pbooking WHERE (ladestelle = ".$ident." OR entladestelle = ".$ident.") AND (palart='".$part."') AND (deleted !=1)
Ich bin mir auch sicher das ein paar if's weg können. Aber das mal zu meinem Versuch das abzubilden was ich benötige... Ergebnisse stimmen so aber nicht
Jetzt schon Danke für jede Hilfe!!!
ich habe wieder ein Problem mit einer SQL Abfrage.
Ich habe eine Tabelle die nennt sich pbooking, darin sind die folgenden Felder für die Abfrage relevant:
ladedatum (ist klar denke ich)
tour_nr (Auftragsnummer)
ladestelle (enthält die Kundennummer der Ladestelle)
lds_geladen (enthält die Anzahl der geladenen Paletten)
lds_entladen (enthält die Anzahl der zurückgegebenen Paletten)
entladestelle (enthält die Kundennummer der Entladestelle)
els_geladen (enthält die Anzahl der geladenen Paletten)
els_entladen (enthält die Anzahl der agegebenen Paletten)
lds_beleg_nr (ist klar denke ich)
els_beleg_nr (ist klar denke ich)
lds_bemerkung (ist klar denke ich)
els_bemerkung (ist klar denke ich)
stockbooking (wert ob die Buchung eine Tour oder Lagerbuchung ist. Nur relevant für die Sortierung)
Mit den o.g. Feldern muss ein sogenannter Packmittelkontoausdruck für einen Kunden oder einen Unternehmer generiert werden. Der Kunde bzw. Unternehmer kann sowohl die Ladestelle als auch die Entladestelle sein. Beides muss jedoch auf einem Ausdruck stehen und auf dem Ausdruck gibt es nur die Spalten geladen und entladen.
Wenn er Ladestelle ist müssen die Felder lds_geladen sowie lds_entladen abgefragt werden, wenn er Entladestelle ist els_geladen und els_entladen.
Quasi sollte es auf dem Ausdruck dann z.B. so aussehen bei den Spalten geladen und entladen:
geladen entladen
wert:lds_geladen wert:lds_entladen (hier ist er Ladestelle)
wert:els_geladen wert:els_entladen (hier ist er Entladestelle)
wert:lds_geladen wert:lds_entladen (hier ist er wieder Ladestelle) usw. usw.
Jetzt noch die Summen der Spalten geladen und entladen auf dem Ausdruck. Ok.
Jetzt kommt das was mir richtig probleme bereitet. Aus den Summen muss die Differenz berechnet werden. Wenn er Ladestelle ist wird die Differenz errechnet aus lds_geladen - lds_entladen, wenn er Entladestelle ist wird die Differenz aus els_entladen - els_geladen errechnet. Jetzt kann es sein das er in einem Monat mal nur Ladestelle war oder nur Entladestelle. Er kann aber auch beides gewesen sein. Bei meinem SQL stimmen die Summen nie.
Hier das was ich gemacht habe. Aber ich hab mittlerweile so einen Knoten im Kopf, ich brauche eure Hilfe:
Gehen wir davon aus das die Kundennummer 80000 ist und diese befindet sich in $ident.
$query = "SELECT
ladedatum AS Ladedatum,
tour_nr AS 'Tour-Nr',
if (ladestelle ='$ident',lds_geladen,els_geladen) AS geladen,
if (ladestelle ='$ident',lds_entladen,els_entladen) AS entladen,
if (ladestelle !='$ident',lds_beleg_nr,els_beleg_nr) AS 'Beleg Nr',
if (ladestelle !='$ident',lds_bemerkung,els_bemerkung) AS 'Bemerkung',
stockbooking
FROM pbooking
WHERE (ladestelle = ".$ident." OR entladestelle = ".$ident.") AND (palart='".$part."') AND (deleted !=1) ORDER BY stockbooking = '1' DESC, ladedatum"
";
Das gibt mir schon mal die Spalten korrekt auf dem Ausdruck aus. Jetzt folgt das SQL für die Berechnungen:
SELECT "
. "sum(if (ladestelle ='".$ident."',lds_geladen,els_geladen)) ,"
. "sum(if(ladestelle ='".$ident."', lds_entladen, els_entladen)) ,"
. "if(ladestelle = ".$ident.",sum(if(ladestelle ='$ident', lds_geladen, els_geladen))-sum(if(ladestelle ='$ident', lds_entladen, els_entladen)), "
. "sum(if(ladestelle ='$ident', lds_i_entladen, els_i_entladen))-sum(if(ladestelle ='$ident', lds_i_geladen, els_i_geladen))) "
. "FROM pbooking WHERE (ladestelle = ".$ident." OR entladestelle = ".$ident.") AND (palart='".$part."') AND (deleted !=1)
Ich bin mir auch sicher das ein paar if's weg können. Aber das mal zu meinem Versuch das abzubilden was ich benötige... Ergebnisse stimmen so aber nicht
Jetzt schon Danke für jede Hilfe!!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 271122
Url: https://administrator.de/forum/mysql-abfrage-bereitet-mir-probleme-271122.html
Ausgedruckt am: 09.01.2025 um 20:01 Uhr
43 Kommentare
Neuester Kommentar
Hallo datadexx,
Wenn du das befolgst, werden die Leute auch hilfsbereit
Der Post ist so getippt sehr unübersichtlich...
Beste Grüße
Dominique
Wenn du das befolgst, werden die Leute auch hilfsbereit
Der Post ist so getippt sehr unübersichtlich...
Beste Grüße
Dominique
Ouch...
Bilde doch erstmal in einem Step alle Summen der eventuell benötigten Werte in einer Tabelle ab.
Und dann - im nächsten Step - überlegst du dir, welche Werte du von welchen subtrahieren möchtest.
Das sollte sehr viel übersichtlicher ausgehen.
Und:
Bitte bearbeite deinen ursprünglichen Beitrag, entferne den Code, den du nun ein zweites Mal geposted hast und grenze die Tabellen etwas ab (z.B. Code oder Quote / oder Tabelle).
Es ist immernoch recht schwer leserlich.
Bilde doch erstmal in einem Step alle Summen der eventuell benötigten Werte in einer Tabelle ab.
Und dann - im nächsten Step - überlegst du dir, welche Werte du von welchen subtrahieren möchtest.
Das sollte sehr viel übersichtlicher ausgehen.
Und:
Bitte bearbeite deinen ursprünglichen Beitrag, entferne den Code, den du nun ein zweites Mal geposted hast und grenze die Tabellen etwas ab (z.B. Code oder Quote / oder Tabelle).
Es ist immernoch recht schwer leserlich.
Moin datadexx,
ich glaube, Clijsters meint es in etwa so:
Wenn du dieses hier mal (nur gedanklich!) verprobst:
... dann könntest du mit zwei Such-Zugriffen auf deine pbookimg-Tabelle jeweils gezielt nach deiner "$ident" suchen.
Einmal explizit im Feld "ladestelle", einmal im Feld "entladestelle".
Das kann jeweils durch einen passenden Index unterstützt werden und ist - verglichen mit dem Konstrukt
sicherlich gefühlte 50000x performanter.
Wenn du diese "virtuelle Tabelle" als ein inneres Select nutzt und dann Summen/Differenzen ermittelst, also so....
...dann hast du es ein wenig übersichtlicher.
(So zumindest würde ich meinen Vorkommentierer interpretieren.)
Grüße
Biber
ich glaube, Clijsters meint es in etwa so:
Wenn du dieses hier mal (nur gedanklich!) verprobst:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
ladestelle,
lds_geladen,
0 as els_geladen,
lds_entladen,
0 as els_entladen
FROM pbooking
WHERE (ladestelle = ".$ident."
AND (palart='".$part."') AND (deleted !=1)
Union ALL
SELECT
entladestelle as ladestelle,
0 as lds_geladen,
els_geladen,
0 as lds_entladen,
els_entladen
FROM pbooking
WHERE (entladestelle = ".$ident."
AND (palart='".$part."') AND (deleted !=1)
... dann könntest du mit zwei Such-Zugriffen auf deine pbookimg-Tabelle jeweils gezielt nach deiner "$ident" suchen.
Einmal explizit im Feld "ladestelle", einmal im Feld "entladestelle".
Das kann jeweils durch einen passenden Index unterstützt werden und ist - verglichen mit dem Konstrukt
"...WHERE (ladestelle = ".$ident." OR entladestelle = ".$ident.") ..AND (..)"
sicherlich gefühlte 50000x performanter.
Wenn du diese "virtuelle Tabelle" als ein inneres Select nutzt und dann Summen/Differenzen ermittelst, also so....
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT Sum(lds_geladen) as Lds_geladen
, Sum(lds_entladen) as lds_entladen
, Sum( lds_geladen -els_entladen) as DifferenzX,...
FROM (
<<das UNION-Konstrukt von oben >>
) x
group by ladestelle
(So zumindest würde ich meinen Vorkommentierer interpretieren.)
Grüße
Biber
Hi datadexx,
Wenn du Bibers Beispiel richtig angewandt hast, solltest du doch alle Differenzen zugreifbar vor dir haben.
Und abhängig von deinen conditions schnappst du dir jetzt das Rechenergebnis, was du gerne hättest und druckst es auf das Blatt.
Oder verstehe ich deine Frage falsch?
Beste Grüße
Dominique
Wenn du Bibers Beispiel richtig angewandt hast, solltest du doch alle Differenzen zugreifbar vor dir haben.
Und abhängig von deinen conditions schnappst du dir jetzt das Rechenergebnis, was du gerne hättest und druckst es auf das Blatt.
Oder verstehe ich deine Frage falsch?
Beste Grüße
Dominique
Moin datadexx,
ich galube, ich ahne das Missverständnis.
In dem unglücklichen Eröffnungsbeitrag, der auch mir zu sehr aus wenig strukturiertem Fliesstext bestand, stand
Demnach brauchst du in der "virtuellen Zwischentabelle" noch ein Feld mehr, d.h. je ein Feld für "Ladestelle" und eines für "Entladestelle".
Dann kannst du, wenn nur das Feld "Ladestelle" gefüllt ist, deine Rechnung gemäß Rechnungsvorschrift für Ladestellen machen und wenn nur das Feld "Entadestelle" gefüllt ist, deine Rechnung gemäß Rechnungsvorschrift für Entladestellen machen in dem äüsseren Select.
Unklar ist mir, wie das Ergebnis (in zwei Spalten dargestellt) sein soll, wenn diese IdentNr 4711 im Wonnemonat Mai tatsächlich Lade- und Entladestation war. Kannst du da mal ein Beispiel posten, zB wenn:
Ident_nr 4711 war Ladestelle, lds_geladen 50, lds entladen 45 und Ident_nr 4711 war auch Entladestelle, els_geladen 100, els_entladen 99.
Was steht in deinen erwähnten zwei Ausgabespalten?
Grüße
Biber
ich galube, ich ahne das Missverständnis.
In dem unglücklichen Eröffnungsbeitrag, der auch mir zu sehr aus wenig strukturiertem Fliesstext bestand, stand
... Wenn er Ladestelle ist wird die Differenz errechnet aus lds_geladen - lds_entladen, wenn er Entladestelle ist wird die Differenz aus els_entladen - els_geladen errechnet. Jetzt kann es sein das er in einem Monat mal nur Ladestelle war oder nur Entladestelle. Er kann aber auch beides gewesen sein.
Demnach brauchst du in der "virtuellen Zwischentabelle" noch ein Feld mehr, d.h. je ein Feld für "Ladestelle" und eines für "Entladestelle".
Dann kannst du, wenn nur das Feld "Ladestelle" gefüllt ist, deine Rechnung gemäß Rechnungsvorschrift für Ladestellen machen und wenn nur das Feld "Entadestelle" gefüllt ist, deine Rechnung gemäß Rechnungsvorschrift für Entladestellen machen in dem äüsseren Select.
Unklar ist mir, wie das Ergebnis (in zwei Spalten dargestellt) sein soll, wenn diese IdentNr 4711 im Wonnemonat Mai tatsächlich Lade- und Entladestation war. Kannst du da mal ein Beispiel posten, zB wenn:
Ident_nr 4711 war Ladestelle, lds_geladen 50, lds entladen 45 und Ident_nr 4711 war auch Entladestelle, els_geladen 100, els_entladen 99.
Was steht in deinen erwähnten zwei Ausgabespalten?
Grüße
Biber
Moin datadexx,
auch mich lässt du jetzt eher ein bisschen verwirrter zurück als vorher.
So wie das Bildchen aussieht, werden die Zahlen ermittelt nach -"ident_nr" und tja, jetzt muss ich raten - nach Datum oder nach BelegNr und gefiltert nach Zeitraum (zB. April 2015)
Okay, dann würde ich auch erwarten, dass diese Kriterien auch in deiner SSQl-Skizze oben auftauchen in den GROUP BY und WHERE-Klauseln.
Dem ist aber nicht so.
Mit dem obigen Ansatz bekommst du doch nur eine Zeile, also die Summenzeile.
Alles andere hast du schon/ermittelst es auf andere Weise?
Anders formuliert: deine beiden "Ergebnisspalten" - von denen willst du genau eine Zeile haben (die mit der Summe) oder willst du eine Zeile haben je Beleg oder Datum + eine Summenzeile?
Grüße
Biber
auch mich lässt du jetzt eher ein bisschen verwirrter zurück als vorher.
So wie das Bildchen aussieht, werden die Zahlen ermittelt nach -"ident_nr" und tja, jetzt muss ich raten - nach Datum oder nach BelegNr und gefiltert nach Zeitraum (zB. April 2015)
Okay, dann würde ich auch erwarten, dass diese Kriterien auch in deiner SSQl-Skizze oben auftauchen in den GROUP BY und WHERE-Klauseln.
Dem ist aber nicht so.
Mit dem obigen Ansatz bekommst du doch nur eine Zeile, also die Summenzeile.
Alles andere hast du schon/ermittelst es auf andere Weise?
Anders formuliert: deine beiden "Ergebnisspalten" - von denen willst du genau eine Zeile haben (die mit der Summe) oder willst du eine Zeile haben je Beleg oder Datum + eine Summenzeile?
Grüße
Biber
Für mich ist eine Zeile eine Tour
Für mich ist eine Zeile, das was in der Datenbank oder der Ausgabe eine Zeile darstellt Also...
Die Abhängigkeiten, was die Subtraktion der Summen angeht, kennen wir ja.
Die Summenbildung selbst kennen wir auch.
Das Ziel und dessen (gewünschter) Weg ist teilweise noch schleierhaft.
An welcher Stelle und unter welchen genauen Bedingungen entscheidet deine Anwendung denn jetzt gerade, ob es sich um eine Entladestelle, eine Ladestelle oder beides handelt? Hat sich daran etwas geändert?
Ist aber in dem Monat $ident nur Entladestelle gewesen muss Summe entladen - Summe geladen gerechnet werden.
Was gerade noch unklar ist:Wenn du "Summe" sagst, meinst du die Werte eines Monats? eines Vorgangs? des Ergebnisses?Beste Grüße
Dominique
P.S.: Wo war noch gleich definiert, ob $ident nun Lade- und/oder Entladestelle ist?
Moin datadexx,
okay, wir tasten uns voran...
Wenn ich es richtig interpretiere, dann brauchst du doch für deinen Auswerte-Monat mehrere "Ergebniszeilen" für diese $ident_nr" 4711, die dann in Rohform (vor dem Summieren) so aussehen:
Typ; Identnr, Datum, Tour; Belegnr, aufgeladen abgeladen
Ladestelle 4111 06.04.2015 Tour20 BelegNr 777, 29, 0
Abladestelle, 4711, 08.04.2015, Tour34, Belegnr (leer), 0, 34
Ladestelle 4111 16.04.2015 Tour66 BelegNr 666, 21, 0
-> das ware also skizziert die Struktur, die das Union-Konstrukt bekommen muss und auf dem du dann ein GROUP BY ident_nr, Typ, Datum, Tour, Belegnr machen kannst
Frage: Sind das jetzt auch deine Kriterien für die Einzelzeilen?
Sprich -
- Für jede Auf-/Abladebuchung gibt es ein Datum/ohne Datum keine Buchung?
- eine Buchung kann eine "Tour"-Nummer haben, muss aber nicht?
- eine Buchung kann eine "Beleg"-Nummer haben, muss aber nicht?
- Eine Tour kann über mehrere Tage gehen und wenn ja - soll eine Zeile je Datum herauskommen oder ein Zeile je Tour?
Sorry für die vielen Rückfragen, aber aus dem Bild der "Buchunsmaske" ist nicht ganz klar, was nun Pflichtfelder sind und welche eher optional.
Und meine praktischen Erfahrungen im Palettenverteilgeschäft sind eher gering.
Grüße
Biber
okay, wir tasten uns voran...
Wenn ich es richtig interpretiere, dann brauchst du doch für deinen Auswerte-Monat mehrere "Ergebniszeilen" für diese $ident_nr" 4711, die dann in Rohform (vor dem Summieren) so aussehen:
Typ; Identnr, Datum, Tour; Belegnr, aufgeladen abgeladen
Ladestelle 4111 06.04.2015 Tour20 BelegNr 777, 29, 0
Abladestelle, 4711, 08.04.2015, Tour34, Belegnr (leer), 0, 34
Ladestelle 4111 16.04.2015 Tour66 BelegNr 666, 21, 0
-> das ware also skizziert die Struktur, die das Union-Konstrukt bekommen muss und auf dem du dann ein GROUP BY ident_nr, Typ, Datum, Tour, Belegnr machen kannst
Frage: Sind das jetzt auch deine Kriterien für die Einzelzeilen?
Sprich -
- Für jede Auf-/Abladebuchung gibt es ein Datum/ohne Datum keine Buchung?
- eine Buchung kann eine "Tour"-Nummer haben, muss aber nicht?
- eine Buchung kann eine "Beleg"-Nummer haben, muss aber nicht?
- Eine Tour kann über mehrere Tage gehen und wenn ja - soll eine Zeile je Datum herauskommen oder ein Zeile je Tour?
Sorry für die vielen Rückfragen, aber aus dem Bild der "Buchunsmaske" ist nicht ganz klar, was nun Pflichtfelder sind und welche eher optional.
Und meine praktischen Erfahrungen im Palettenverteilgeschäft sind eher gering.
Grüße
Biber
Moin datadexx,
so, versuchen wir mal, diese Kuh vom Eis zu holen.
Mein Ansatz wäre jetzt, die "inneren Select" um ein Feld zu erweitern, damit du zwischen "Ladestelle" und "Entladestelle" unterscheiden kannst.
Also so:
Dann sollte es möglich sein, in einer aussen liegenden SUM()-Aggregation eine CASE WHEN-Bedingung einzubauen.
Bitte prüfe doch aber erstmal dieses "innere Select" auf ein paar Beispieldaten, ob wir damit in die richtige Richtung gegeh.
möchte mich da lieber schrittweise rantasten - ich kann deine Daten hier nicht sinnvoll simulieren.
P.S.
Aber falls du da für eine ident_nr und einen Monat ein paar realitätsnahe Beispieldaten hast, dann lässt es sich schon nachbilden.
D.h. wenn es meinetwegen so jeweils 3-5 Sätze für die Identnr 4711 als Ladestelle/Entladestelle für einen Moant gibt...
Grüße
Biber
so, versuchen wir mal, diese Kuh vom Eis zu holen.
Mein Ansatz wäre jetzt, die "inneren Select" um ein Feld zu erweitern, damit du zwischen "Ladestelle" und "Entladestelle" unterscheiden kannst.
Also so:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT
'L' as LadeEntlade
ladestelle,
lds_geladen,
0 as els_geladen,
lds_entladen,
0 as els_entladen
FROM pbooking
WHERE (ladestelle = '".$ident."' AND palart='".$part."' AND deleted !=1 AND MONTH(ladedatum) = ".$dayfilter.")
Union ALL
SELECT
'E' as LadeEntLade
entladestelle,
0 as lds_geladen,
els_geladen,
0 as lds_entladen,
els_entladen
FROM pbooking
WHERE (entladestelle = '".$ident."' AND palart='".$part."' AND deleted !=1 AND MONTH(ladedatum) = ".$dayfilter.")
) x
group by ladestelle, LadeEntlade
Dann sollte es möglich sein, in einer aussen liegenden SUM()-Aggregation eine CASE WHEN-Bedingung einzubauen.
Bitte prüfe doch aber erstmal dieses "innere Select" auf ein paar Beispieldaten, ob wir damit in die richtige Richtung gegeh.
möchte mich da lieber schrittweise rantasten - ich kann deine Daten hier nicht sinnvoll simulieren.
P.S.
Aber falls du da für eine ident_nr und einen Monat ein paar realitätsnahe Beispieldaten hast, dann lässt es sich schon nachbilden.
D.h. wenn es meinetwegen so jeweils 3-5 Sätze für die Identnr 4711 als Ladestelle/Entladestelle für einen Moant gibt...
Grüße
Biber
Moin datadexx,
sorry für die späte Rückmeldung - ich hatte ungeplanterweise ein längeres relativ computerfreies Wochenende.
Habe mir jetzt mal das Ganze mit deinen Daten und deinen Testqueries angeschaut.
Mir ist nur noch nicht klar, ob bzw was jetzt noch fehlt.
die geforderten Daten sind eigentlich doch schon abgreifbar.
Resultset wäre dann sowas wie
--> diese Query würde als Felder X und Y die geforderten Differenzen für eine Ident_nr bringen.
Okay, die Differenzierung nach Lade/Entladestelle ist zwar verfügbar, wird aber nicht genutzt.
Was fehlt denn noch?
Grüße
Biber
sorry für die späte Rückmeldung - ich hatte ungeplanterweise ein längeres relativ computerfreies Wochenende.
Habe mir jetzt mal das Ganze mit deinen Daten und deinen Testqueries angeschaut.
Mir ist nur noch nicht klar, ob bzw was jetzt noch fehlt.
die geforderten Daten sind eigentlich doch schon abgreifbar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT ladestelle
-- Sum(lds_geladen) as lds_geladen
--, Sum(lds_entladen) as lds_entladen
-- , Sum(els_entladen) as els_entladen
-- , Sum(els_geladen) as els_geladen
, Sum(lds_geladen - els_entladen) AS X
, Sum(lds_entladen - els_geladen) AS Y
FROM (
SELECT
'L' as LadeEntlade,
ladestelle,
lds_geladen,
0 as els_geladen,
lds_entladen,
0 as els_entladen
FROM pbooking
WHERE (ladestelle = '80246' AND palart='H1' AND deleted !=1 AND MONTH(ladedatum) = 4)
Union ALL
SELECT
'E' as LadeEntlade,
entladestelle as ladestelle,
0 as lds_geladen,
els_geladen,
0 as lds_entladen,
els_entladen
FROM pbooking
WHERE (entladestelle = '80246' AND palart='H1' AND deleted !=1 AND MONTH(ladedatum) = 4)
) x
group by ladestelle
Resultset wäre dann sowas wie
1
2
3
2
3
LADESTELLE | X | Y
-----------+---+----
80246 | 0 | -10
--> diese Query würde als Felder X und Y die geforderten Differenzen für eine Ident_nr bringen.
Okay, die Differenzierung nach Lade/Entladestelle ist zwar verfügbar, wird aber nicht genutzt.
Was fehlt denn noch?
Grüße
Biber
Moin datadexx,
dann liesse es sich vermutlich reduzieren auf
ResultSet wäre dann
(eigentlich nur benötigt sind "Ladestelle" und "DiffXY")
Ich habe jetzt mal zwei ident_nr in die Query genommen und zeige nicht nur das eine benötigte Feld "DiffXY" an, sondern zum Nachvollziehen auch noch die "Einzelsummanden"-Felder für lds_geladen, lds_entladen etc.
Diese vier Zeilen " , Sum(lds_geladen) as lds_geladen" + 3 danach können natürlich entfallen in der echten Query.
Andersrum: wenn du zum Debuggen noch eine Detailebene mehr brauchst, dann entferne die beiden Kommentar-Kennzeichen "--" vor dem Wort "ladeentlade".
Da musst du mal prüfen, ob das Ergebnis sinnhaft und plausibel ist oder nicht - das kann ich fachlich nicht beurteilen.
Grüße
Biber
dann liesse es sich vermutlich reduzieren auf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
SELECT ladestelle
-- , ladeentlade
, Sum(lds_geladen) as lds_geladen
, Sum(lds_entladen) as lds_entladen
, Sum(els_entladen) as els_entladen
, Sum(els_geladen) as els_geladen
, Sum( case when ladeentlade ='L' then lds_geladen - els_entladen
when ladeentlade ='E' then lds_entladen - els_geladen
end ) as diffXY
FROM (
SELECT
'L' as LadeEntlade,
ladestelle,
lds_geladen,
0 as els_geladen,
lds_entladen,
0 as els_entladen
FROM pbooking
WHERE (ladestelle in ('80246', '80190') AND palart='H1' AND deleted !=1 AND MONTH(ladedatum) = 4)
Union ALL
SELECT
'E' as LadeEntlade,
entladestelle as ladestelle,
0 as lds_geladen,
els_geladen,
0 as lds_entladen,
els_entladen
FROM pbooking
WHERE (entladestelle in ('80246', '80190') AND palart='H1' AND deleted !=1 AND MONTH(ladedatum) = 4)
) x
group by ladestelle -- , ladeentlade
;
ResultSet wäre dann
1
2
3
4
2
3
4
LADESTELLE | LDS_GELADEN | LDS_ENTLADEN | ELS_ENTLADEN | ELS_GELADEN | DIFFXY
-----------+-------------+--------------+--------------+-------------+-------
80190 | 0 | 10 | 0 | 10 | -10
80246 | 0 | 0 | 0 | 10 | -10
(eigentlich nur benötigt sind "Ladestelle" und "DiffXY")
Ich habe jetzt mal zwei ident_nr in die Query genommen und zeige nicht nur das eine benötigte Feld "DiffXY" an, sondern zum Nachvollziehen auch noch die "Einzelsummanden"-Felder für lds_geladen, lds_entladen etc.
Diese vier Zeilen " , Sum(lds_geladen) as lds_geladen" + 3 danach können natürlich entfallen in der echten Query.
Andersrum: wenn du zum Debuggen noch eine Detailebene mehr brauchst, dann entferne die beiden Kommentar-Kennzeichen "--" vor dem Wort "ladeentlade".
Da musst du mal prüfen, ob das Ergebnis sinnhaft und plausibel ist oder nicht - das kann ich fachlich nicht beurteilen.
Grüße
Biber
Moin datadexx,
da bin ich ganz bei dir - mir kam es auch nicht plausibel vor.
Ich vermute mal, die "richtige" Summenberechnung sollte lauten wie bei "DiffYZ", die du mal zum Vergleich einbauen kannst in obiges Select.
Passt das besser?
Grüße
Biber
P.S.
BTW - Ladestelle/Entladestelle bzw Ident_nr und auch der Rückgabewert von Month(datumswert) sind numerisch.
Beides wird aber in deinen Queries als Text-Wert behandelt bzw.angegeben. Muss nicht sein.
Die überflüssige implizite Casterei
Reichen würde ein
da bin ich ganz bei dir - mir kam es auch nicht plausibel vor.
Ich vermute mal, die "richtige" Summenberechnung sollte lauten wie bei "DiffYZ", die du mal zum Vergleich einbauen kannst in obiges Select.
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
...
, Sum( case when ladeentlade ='L' then lds_geladen - els_entladen
when ladeentlade ='E' then lds_entladen - els_geladen
end ) as diffXY
, Sum( case when ladeentlade ='E' then els_geladen - els_entladen
when ladeentlade ='L' then lds_geladen - lds_entladen
end ) as diffYZ
...
Passt das besser?
Grüße
Biber
P.S.
BTW - Ladestelle/Entladestelle bzw Ident_nr und auch der Rückgabewert von Month(datumswert) sind numerisch.
Beides wird aber in deinen Queries als Text-Wert behandelt bzw.angegeben. Muss nicht sein.
Die überflüssige implizite Casterei
... WHERE (entladestelle in ('80246', '80190')
kann entfallen.Reichen würde ein
WHERE (entladestelle in (80246, 80190)
.