SQL-Code:
select concat(waaunr,'-', waaupo) as auftrag,
watenr,
oaagnr,
oamanr,
oarmda,
oatlkz,
oarmmg,
sum(oarmmg * wagewi / 1000) as wagewi
from as400archiev a
where exists (
select 1 from as400archiev b
where Year(b.oarmda) = 2015
and a.waaunr = b.waaunr
and a.waaupo = b.waaupo
-- hier dürfen nur die Sachen abgefragt werden,
-- die die AuftragsNr bilden, alles andere führt zu
-- ungewünschten Ergebnissen, da es das Abfrageergebnis
-- weiter einschränkt, als erforderlich.
-- wegen :Bei dieser Variante scheinen die Arbeitsgänge durch Jahresübergänge verloren zu gehen...
-- and a.oaagnr = b.oaagnr -- auskommentiert.
)
group by
a.waaunr,
a.waaupo,
a.oaagnr
Damit wir das Problem noch etwas besser verstehen können, bitte eine "Übersetzung" der Spaltennamen "liefern", die Kürzel erscheinen mir doch eher sehr (fehl)interpretationsanfällig.
Welche Spalteninhalte sind "jahresübergreifend" und welche nicht?
In der Wherebedingung dürfen keine Spalten abgefragt werden, für die die Jahreseinschränkung im Endergebnis nicht relevant ist, sondern nur die für die Ermittlung der Datensätze, die zwingend auch im abgefragten Jahr zu finden sein müssen.
Der Arbeitsgang scheint mir hier in der Abfrage daher fehl am Platz. Ausgehend von Deinem Beispiel im Eingangspost enthält er nur ein Fertigdatum und kann daher nicht "jahresübergreifend" vorkommen. Diese Einschränkung dürfte die Ursache für den Verlust der Jahresübergänge sein. (Aber da kann ich mich auch durchaus irren.)
Und bei der Datenmenge muss man dann wohl doch sehr auf die Feinheiten der
DB und deren Umsetzung der Abfragen achten, sonst wird's doch eher laaaaangsam
Achso: Weiß nicht wie das bei
MySQL ist, aber dashier Year(b.oarmda) kann Dir eventuell die Nutung des Index kaputtmachen, da ja nur eine Teilmenge des Wertes gebraucht wird. Hier könnte also die Abfrage mit
b.oarmda between CAST('2018-01-01' AS DATE) and CAST('2018-12-31' AS DATE)
schlimmsten- / bestenfalls so das eine oder andere Stündchen Abfragedauer einsparen.
Wenn möglich Parameter nutzen, keine Funktionen in die Wherebedingung, die eine Spalte in einen anderen Type konvertieren oder nur Teilmengen einer Spalte nutzen. Lieber ein between mit kleinstem und größtem zulässigen Wert nutzen.