Einzelnen Beitrag anzeigen

quaero

Registriert seit: 25. Apr 2013
38 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: SQL-Statement zu aufwendig

  Alt 28. Mai 2014, 09:59
Hallo Zusammen,

ich habe eine Tabelle, in der die Artikel und die Kundenbedarfe stehen. Jetzt möchte ich gerne mit einer Query für jeden Disponenten folgende Daten holen:
ArtikelNr, Lieferungen die überfällig sind (Lieferdatum<aktuelles Datum), Summe der Mengen je Artikel für aktuellen Monat, Summe der Mengen je Artikel für nächsten Monat, Summe der Mengen je Artikel für übernächsten Monat.

Ich habe folgendes ausprobiert, aber neben der Tatsache, dass die Werte nicht stimmten, benötigt die Query auch über 30min.... WIe kann ich das geschickter machen?

Delphi-Quellcode:
select concat(liefersituation.watenr,' ',liefersituation.tebez1) as 'Artikel Bezeichnung', sum(t1.ltrest) as Rückstand, sum(t2.ltrest) as 'Bedarf aktueller Monat', sum(t3.ltrest) as 'Bedarf nächster Monat', sum(t4.ltrest) as 'Bedarf übernächster Monat'  from liefersituation
left join liefersituation as t1 on t1.watenr=liefersituation.watenr and t1.ltlite<current_date
left join liefersituation as t2 on t2.watenr=liefersituation.watenr and month(t2.ltlite)=month(current_date)
left join liefersituation as t3 on t3.watenr=liefersituation.watenr and month(t3.ltlite)=month(current_date)+1
left join liefersituation as t4 on t4.watenr=liefersituation.watenr and month(t4.ltlite)=month(current_date)+2
where liefersituation.lpdivk='ssc'  //Disponenten-Kürzel
group by liefersituation.watenr
order by liefersituation.watenr


Vielen Dank
Patrick
Du könntest zunächst eine Anfrage an die DB schicken, die bereits alle Informationen enthält:
SQL-Code:
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)
Damit hättest du erst einmal die Mengen der einzelnen Produkte der jeweiligen Monate bis einschließlich übernächsten Monat.
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:
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
 ...
Anschließend kannst du über dieses 2. Ergebnis aggregieren und solltest das gewünschte Ergebnis erhalten:
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
  Mit Zitat antworten Zitat