Beantwortet

Leistungsbericht pro Versandplatz / Berichte / MySQL


Benutzerebene 4
Abzeichen +1

Moin Xentraleers,

wir würden gerne einen Leistungsbericht pro Versandplatz erstellen. Am Ende wollen wir die Packleistung pro Tag, Platz und Projekt besser einschätzen können. Mein Bericht crasht aber leider unserer Instanz :-) Ich bin leider auch kein großer MySQL-Experte, daher die Frage: Kann hier jemand auf die Schnelle den Fehler finden:

SELECT 
DATE_FORMAT(lspro.Zeit,'%d.%m.%Y') AS Datum,
lspro.Bearbeiter as Versandplatz,
x.Projekt AS Projekt,
REPLACE(ROUND(COUNT(DISTINCT(lspro.Lieferschein)),0),'.',',') AS Lieferscheine,
REPLACE(ROUND(COUNT(DISTINCT(lspos.id)),0),'.',',') AS Positionen,
REPLACE(ROUND(SUM(x.Pakete),0),'.',',') AS Pakete,
REPLACE(ROUND(SUM(lspos.menge),0),'.',',') AS Picks
FROM lieferschein_protokoll lspro
JOIN lieferschein_position lspos ON lspos.lieferschein = lspos.lieferschein
JOIN
(
SELECT
CASE
WHEN ls.Projekt IN (6,5,4,7) THEN 'Vertriebskanal1'
WHEN ls.Projekt = '3' THEN 'Vertriebskanal2'
WHEN ls.Projekt = '8' THEN 'Vertriebskanal3'
WHEN ls.Projekt = '2' THEN 'Vertriebskanal4'
ELSE 'Other'
END AS Projekt,
ls.id AS id,
COUNT(v.id) AS Pakete
FROM lieferschein ls
JOIN versand v ON ls.id = v.lieferschein
GROUP BY id
) as x ON lspro.lieferschein = x.id
WHERE lspro.Grund = 'Verarbeitung im Versandzentrum'
GROUP BY Datum, Versandplatz, Projekt

Die Abfrage wirft mir keinen Fehler, aber führt zum 500er Fehler in unseren Instanz. Ich traue mich daher auch gerade nicht mehr groß damit zu testen…Es wäre super, wenn hier jemand helfen könnte.

Vielen Dank & besten Gruß,

Torge

icon

Beste Antwort von Torge 30 November 2022, 08:05

Original anzeigen

7 Antworten

Benutzerebene 7
Abzeichen +5

Hi Torge, 

auf die Schnelle würde ich mal in der WHERE Bedingung auf den aktuellen Tag filtern, um weniger Daten in der Auswahl zu haben. Ich denke das Sub-Select bei einer großen Datenbank ist recht teuer. 

Ich habe so einen ähnlichen Bericht. Aber der basiert auf den Daten aus dem Versandzentrum und nicht auf der Lieferschein Tabelle.

BG, Daniel 

https://www.dsconsult.de/produkt/xentral-report-anzahl-pakete-pro-tag-und-mitarbeiter/

 

Benutzerebene 4
Abzeichen +1

Moin @Daniel Schmidtchen,

vielen Dank für deine Rückmeldung. Ich probiere das heute Abend einmal aus, wenn sonst niemand unsere Instanz braucht. Wenn du deinen Bericht ansonsten um

  • #Lieferscheine
  • #Positionen und
  • #Picks
  • eine Spalte mit dem Projekt

erweiterst, dann wäre ich sofort mit 50,00€ dabei ;-)

Danke & Grüße,

Torge

Benutzerebene 7
Abzeichen +5

🤣

Benutzerebene 4
Abzeichen +1

Moin @Daniel Schmidtchen,

ich habe es mit

WHERE lspro.Grund = 'Verarbeitung im Versandzentrum' AND lspro.Zeit > '2022-11-27 14:08:07'

probiert...timeout...Instanz weg :-/

Bekommt man das ohne Subselect hin?

Grüße,

Torge

Benutzerebene 7
Abzeichen +5

Die ON-Bedingung macht so keinen Sinn, oder?

JOIN lieferschein_position lspos ON lspos.lieferschein = lspos.lieferschein

wolltest du das mappen?

JOIN lieferschein_position lspos ON lspos.lieferschein = lspro.lieferschein

Benutzerebene 4
Abzeichen +1

Moin Daniel,

argh - ich Trottel. Du hast Recht.

Baue ich gleich um und teste heute Abend nochmal. Ich gebe Bescheid und teile den Code, wenn es klappt.

Danke & Grüße,

Torge

Benutzerebene 4
Abzeichen +1

Moin Xentraleers,

ich glaube so passt es:

SELECT
CASE
WHEN ls.Projekt IN (6,5,4,7) THEN 'Vertriebskanal 1'
WHEN ls.Projekt = '3' THEN 'Vertriebskanal 2'
WHEN ls.Projekt = '8' THEN 'Vertriebskanal 3'
WHEN ls.Projekt = '2' THEN 'Vertriebskanal 3'
ELSE 'Other'
END AS Projekt,
y.Datum AS Datum,
y.Versandplatz AS Versandplatz,
REPLACE(ROUND(COUNT(DISTINCT(ls.id)),0),'.',',') AS Lieferscheine,
REPLACE(ROUND(SUM(y.Positionen),0),'.',',') AS Positionen,
COUNT(v.id) AS Pakete,
REPLACE(ROUND(SUM(y.Picks),0),'.',',') AS Picks
FROM lieferschein ls
JOIN versand v ON ls.id = v.lieferschein
JOIN (
SELECT
lspos.lieferschein AS LieferscheinID,
DATE_FORMAT(min(x.Verarbeitungszeit),'%d.%m.%Y') AS Datum,
x.Versandplatz AS Versandplatz,
COUNT(DISTINCT(lspos.id)) AS Positionen,
SUM(lspos.menge) AS Picks
FROM lieferschein_position lspos
JOIN (
SELECT
lspro.lieferschein AS lsid,
min(lspro.Zeit) AS Verarbeitungszeit,
lspro.Bearbeiter as Versandplatz
FROM lieferschein_protokoll lspro
WHERE lspro.Grund = 'Verarbeitung im Versandzentrum'
GROUP BY lsid
) x ON lspos.lieferschein = x.lsid
GROUP BY lsid
) y ON ls.id = y.LieferscheinID
GROUP BY Datum, Versandplatz, Projekt

Vielleicht hilft es wem. Lasst mich gerne wissen, wenn da jemand einen Fehler findet :-)

Danke & Grüße,

Torge

Antworten