Vorjahreswerte parallel zu aktuellen Werten ausgeben

RalfW

Neuer Benutzer
Beiträge
1
Gude aus dem schönen Mittelhessen!

Ich zermatere mir seit ein paar Tagen das Gehirn auf der Suche nach einer halbwegs eleganten (oder zumindest funktionierenden) Lösung für folgendes Problem:

Für eine Umsatzauswertung wird eine Ausgabe in folgendem Format benötigt:

Artikel | Umsatz aktuelles | Umsatz Vorjahr | Menge aktuell | Menge Vorjahr

Die für diese Auswertung benötigten Daten werden aus zwei Tabellen bezogen: AAGFAKT und AAGFAKTPOS

In der Tabelle Aufträge befinden sich die für die Fakturierung notwendigen Daten wie Rechnungsdatum etc. aus der Tabelle AAGFAKTPOS werden die Daten der Artikel bezogen (wie z.B. Preis und Menge).

Die Daten für den aktuellen Monatsumsatz zu beziehen ist kein größeres Problem (siehe Codeschnipsel weiter unten), wie ich die Daten für den Vorjahreszeitraum im gleichen Statement beziehen kann um damit die Spalten "Umsatz Vorjahr" und "Menge Vorjahr" zu befüllen scheitert bei mir anscheinend gerade an einer Denkblockade....

Ich bin für jeden Hinweis dankbar!

Code:
select AAGFAKTPOS.ARTNR1, AAGFAKTPOS.ABEZ1, SUM(AAGFAKTPOS.BERECHMENGE) as Menge, SUM(AAGFAKTPOS.PREIS) as Umsatz
   
from AAGFAKT

inner join AAGFAKTPOS
on AAGFAKT.LFDFAKTNR = AAGFAKTPOS.LFDFAKTNR

where

AAGFAKT.FAKTDATUM BETWEEN
CONVERT(datetime, '01.09.2014 00:00:00', 104)
AND CONVERT(datetime, '30.09.2014 23:59:59', 104)

group by AAGFAKTPOS.ABEZ1, AAGFAKTPOS.ARTNR1
order by AAGFAKTPOS.ABEZ1
 
Werbung:
Das ist eigentlich nicht schwer, man muss nur die Tabelle mit sich selbst Joinen. Da deine Ausgangstabelle schon ein Join ist, würde ich das ganze in zwei Teile zerlegen:
1) Die Daten in einer Sicht aufbereiten (oder wie hier mit WITH eine Tabelle on the fly erzeugen) und nach Jahr / Monat gruppieren.
2) Das Ergebnis mit sich selbst Joinen aber eben immer auf den Vorjahreszeitraum. Davon dann nur den Zeitraum anfordern, den du brauchst.
Code:
WITH t AS (
SELECT    datepart(yyyy,AAGFAKT.FAKTDATUM) AS Jahr,
        datepart(mm,AAGFAKT.FAKTDATUM) AS Monat,
        AAGFAKTPOS.ARTNR1,
        AAGFAKTPOS.ABEZ1,
        SUM(AAGFAKTPOS.BERECHMENGE) AS Menge,
        SUM(AAGFAKTPOS.PREIS) AS Umsatz
FROM    AAGFAKT
INNER JOIN AAGFAKTPOS
ON        AAGFAKT.LFDFAKTNR = AAGFAKTPOS.LFDFAKTNR
GROUP BY datepart(yyyy,AAGFAKT.FAKTDATUM),datepart(mm,AAGFAKT.FAKTDATUM),AAGFAKTPOS.ABEZ1, AAGFAKTPOS.ARTNR1
        )
SELECT    t1.ARTNR1,
        t1.ABEZ1,
        t1.Menge,
        t1.Umsatz,
        t2.Menge AS Menge_Vorjahr,
        t2.Umsatz AS Umsatz_Vorjahr
FROM    t t1
LEFT JOIN t t2
ON        t1.RTNR1 = t2.RTNR1
AND        t1.ABEZ1 = t2.ABEZ1
AND        t1.Jahr = t2.Jahr + 1
AND        t1.Monat = t2.Monat
WHERE    t1.Jahr = 2014
AND        t1.Monat = 9
ORDER BY t1.ARTNR1,t1.ABEZ1
 
Zurück
Oben