![]() |
AW: SQL-Statement zu aufwendig
Wobei dein Code doch auch nur geht, wenn es für jeden Artikel (watenr+tebez1) maximal je einen Eintrag pro Zeitraum gibt. (und das sollten die ursprünglichen Joins auch hinbekommen, wenn vielleicht auch etwas langsamer).
Wobei bei den Joins alle Zeiträume in je einem Artikeldatensatz zusammen sein müssen, da sie sonst doppelt/mehrfach eingerecht werden. |
AW: SQL-Statement zu aufwendig
Die Ergebniss ist wahrscheinlich falsch weil da nur auf Monat verglichen wird , d.h. es wir Mai 2014+Mai2013 +Mai2012 usw aufaddiert
da muss noch ein Vergleich auf Jahr hinein Zur Geschwindigkeit, das extract kann keinen Index verwenden es führt immer zu einem Full Table Scan schneller wird wenn man die Bedingungen mit 2014-05-01<=Liefertermin<=2014-05-31 eingrenzt dann kann ein Index auf Liefertermin verwendet werden und das Ergebniss stimmt auch mfg Hannes |
AW: SQL-Statement zu aufwendig
Zitat:
SQL-Code:
Aber ich dachte, wenn er seine Monate haben will, soll er doch. Die Eingrenzung des Lieferdatums funktioniert wegen der Spalte 'Rückstände' nicht, denn man weiß nicht, wann der älteste Rückstand ist.
...
SUM(IIF (ltlite between @firstOfMonth and @lastOfMonth, ltRest,0)) as 'Bedarf Monat' ... Bei einer Aggregierung über die Tabelle ist ein Scan zwingend. Bei sehr großen Tabellen könnte ein Index auf den Aggregatspalten etwas bringen, aber das dürfte auf das RDBMS ankommen. |
AW: SQL-Statement zu aufwendig
In solchen Fällen kann es auch helfen, wenn man mit temporären Tabellen arbeitet.
Die zu untersuchende Datenmenge wird mit einem einfachen SELECT in eine auf die Suche passendes Format gebracht (z.B. der Monat) und eingeschränkt. Dann werden dort passende Indizes für die Suche (Spalte Monat) erstellt und mit dieser reduzierten Datenmenge wird dann die konkrete Abfrage durchgeführt. BTW: Trotz allem können solche Abfragen je nach Datenvolumen eine gewisse Zeit in Anspruch nehmen. Dann lässt man diese nicht synchron am Client laufen, sondern asynchron auf dem Server (eigene Anwendung). |
AW: SQL-Statement zu aufwendig
Zitat:
Zitat:
Die o.g. Auswertung erhalte ich dann über einen PIVOT |
AW: SQL-Statement zu aufwendig
Zitat:
SQL-Code:
Damit hättest du erst einmal die Mengen der einzelnen Produkte der jeweiligen Monate bis einschließlich übernächsten Monat.
SELECT concat(watenr,' ',tebez1) AS 'Artikel Bezeichnung', year(ltlite) AS Jahr, month(ltlite) AS Monat, SUM(ltrest) AS Menge
FROM liefersituation WHERE liefersituation.lpdivk='ssc' //Disponenten-Kürzel AND ((year(ltlite) < year(dateadd(m, 2, getdate()))) // vergangene Jahre vor übernächsten Monat komplett OR ((year(ltlite) = year(dateadd(m, 2, getdate()))) AND (month(ltlite) <= month(dateadd(m, 2, getdate()))))) // aktuelles Jahr das übernächsten Monats bis zu diesem group by concat(watenr,' ',tebez1), year(ltlite), month(ltlite) order by concat(watenr,' ',tebez1), year(ltlite), month(ltlite) Aus dem Ergebnis müsstest du jetzt noch alles, was zum aktuellen Monat gehört in eine eigene Spalte ausgliedern, alles vom nächsten Monat in eine weitere und alles vom übernächsten Monat in noch eine:
SQL-Code:
Anschließend kannst du über dieses 2. Ergebnis aggregieren und solltest das gewünschte Ergebnis erhalten:
SELECT [Artikel Bezeichnung], Monat, Jahr, Menge AS Rückstand, 0 AS 'aktueller Monat', 0 AS 'nächster Monat', 0 AS 'übernächster Monat'
FROM ergebnis1 // erste SQL-Anfrage WHERE (Jahr < year(getdate())) // vergangene Jahre OR ((Jahr = year(getdate())) AND (Monat < month(getdate()))) // vergangene Monate des aktuellen Jahres UNION SELECT [Artikel Bezeichnung], Monat, Jahr, 0 AS Rückstand, Menge AS 'aktueller Monat', 0 AS 'nächster Monat', 0 AS 'übernächster Monat' FROM ergebnis1 // erste SQL-Anfrage WHERE Jahr = year(getdate()) AND Monat = month(getdate()) UNION SELECT [Artikel Bezeichnung], Monat, Jahr, 0 AS Rückstand, 0 AS 'aktueller Monat', Menge AS 'nächster Monat', 0 AS 'übernächster Monat' FROM ergebnis1 // erste SQL-Anfrage WHERE Jahr = year(dateadd(m, 1, getdate())) AND Monat = month(dateadd(m, 1, getdate())) UNION // übernächster Monat ...
SQL-Code:
SELECT [Artikel Bezeichnung], SUM([Rückstand]), SUM([aktueller Monat]), SUM([nächster Monat]), SUM([übernächster Monat])
FROM ergebnis2 // zweite SQL-Anfrage GROUP BY [Artikel Bezeichnung] Bei Bedarf kannst du für das erste Ergebnis auch eine Sicht bilden und die zweite und dritte Anfrage zu einer zusammenfassen. Grüße quaero |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz