TSQL - Referenzierung auf vorherigen Datensatz
Hallo Leute.
Ich habe folgendes SQL-Statement:
Dieses Statement liefert mir nun folgende Ergebnissmenge:
Abfrage ist soweit korrekt und liefert auch richtige Ergebnise.
Nun habe ich jedoch noch folgende Anforderung:
Wenn es für eine Artikelnummer zwei zeilen gibt, muss der Soll-Wert bzw. die Differenz anders berechnet werden.
Am Beispiel der Artikelnummer "010KEU006042":
Hier haben wir einen Soll-Wert von 200.
Da wir jedoch zwei Datensätze haben, haben wir jedoch einen Ist-Wert von insgesamt 205.
Die Ergebnissmenge müsste also auf einen Datensatz pro Artikelnummer reduziert werden, und die IST-Werte addiert werden, damit ich folgendes raus bekomme:
wie muss ich die Abfrage umbauen um das gewünschte Ergebniss zu bekommen?
Ich hätte ja an ein Group By gedacht, das kann ich jedoch nicht verwenden, da die zwei Datensätze unterschiedliche Kennungen im Feld "lagerprotokoll.BELEGPKENNUNG" haben, somit würde er es nicht zusammengruppieren, da ich ja die "lagerprotokoll.BELEGPKENNUNG" ebenfalls in das GroupBy mit einbeziehen müsste.
Habt Ihr da eine Idee dazu?
Danke im Vorraus & LG
Ich habe folgendes SQL-Statement:
select
fertigungsauftrag.ID as 'Fertigungsauftrag Nr.',
fertigungsartikel.Artikelnummer as 'Artikelnummer',
case when fertigungsartikel.DetailTyp = 'V' then 'Verbrauch' when fertigungsartikel.DetailTyp = 'E' then 'Ergebniss' end as 'Atyp',
fertigungsartikel.menge * fertigungsbedarf.Bedarfsmenge as 'Soll',
case when fertigungsartikel.DetailTyp = 'V' then (lagerprotokoll.Bestand * -1) when fertigungsartikel.DetailTyp = 'E' then lagerprotokoll.Bestand end as 'Ist',
case when fertigungsartikel.DetailTyp = 'V' then (fertigungsartikel.menge * fertigungsbedarf.Bedarfsmenge)-(lagerprotokoll.Bestand * -1) when fertigungsartikel.DetailTyp = 'E' then (fertigungsartikel.menge * fertigungsbedarf.Bedarfsmenge)-(lagerprotokoll.Bestand) end as 'Differenz'
from fertigungsartikel
left join produktionsschritt on fertigungsartikel.ProduktionsschrittID = produktionsschritt.ID
left join fertigungsauftrag on produktionsschritt.FertigungID = fertigungsauftrag.ID
left Join fertigungsbedarf on fertigungsbedarf.fertigungsauftragid = fertigungsauftrag.ID
left join werkauftragdetails on werkauftragdetails.FertigungsartikelID = fertigungsartikel.ID
left join lagerprotokoll on lagerprotokoll.BELEGPKENNUNG = werkauftragdetails.LagerKennung
where produktionsschritt.fertigungTyp = '3'
and fertigungsauftrag.ID = '19'
order by fertigungsauftrag.ID, fertigungsartikel.Artikelnummer
Dieses Statement liefert mir nun folgende Ergebnissmenge:
~Fertigungsauftrag Nr. | ~Atyp | ~Artikelnummer | ~Soll | ~Ist | ~Differenz |
19 | Verbrauch | 010KEU006042 | 200 | 200 | 0 |
19 | Verbrauch | 010KEU006042 | 200 | 5 | 195 |
19 | Verbrauch | 010KEU013015 | 300 | 300 | 0 |
19 | Ergebniss | 050STA080140 | 100 | 85 | 15 |
Abfrage ist soweit korrekt und liefert auch richtige Ergebnise.
Nun habe ich jedoch noch folgende Anforderung:
Wenn es für eine Artikelnummer zwei zeilen gibt, muss der Soll-Wert bzw. die Differenz anders berechnet werden.
Am Beispiel der Artikelnummer "010KEU006042":
Hier haben wir einen Soll-Wert von 200.
Da wir jedoch zwei Datensätze haben, haben wir jedoch einen Ist-Wert von insgesamt 205.
Die Ergebnissmenge müsste also auf einen Datensatz pro Artikelnummer reduziert werden, und die IST-Werte addiert werden, damit ich folgendes raus bekomme:
~Fertigungsauftrag Nr. | ~Atyp | ~Artikelnummer | ~Soll | ~Ist | ~Differenz |
19 | Verbrauch | 010KEU006042 | 200 | 205 | 5 |
wie muss ich die Abfrage umbauen um das gewünschte Ergebniss zu bekommen?
Ich hätte ja an ein Group By gedacht, das kann ich jedoch nicht verwenden, da die zwei Datensätze unterschiedliche Kennungen im Feld "lagerprotokoll.BELEGPKENNUNG" haben, somit würde er es nicht zusammengruppieren, da ich ja die "lagerprotokoll.BELEGPKENNUNG" ebenfalls in das GroupBy mit einbeziehen müsste.
Habt Ihr da eine Idee dazu?
Danke im Vorraus & LG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 665671
Url: https://administrator.de/contentid/665671
Ausgedruckt am: 26.11.2024 um 15:11 Uhr
7 Kommentare
Neuester Kommentar
Moin,
ohne das ich mir jetzt deine Query im Detail angesehen hätte...
Mach dir einen View,
- mit einem Feld in dem Fertigungsauftrag Nr., Atyp und Artikelnummer aneinander"geklebt" sind und gruppier danach
- jeweils SUM für Soll und Ist
und verwende den dann in deinem Query anstatt der "echten" Tabelle
Nicht besonders Performant, aber das ist bei den vielen CASE Statements wahrscheinlich eh schon egal
lg,
Slainte
ohne das ich mir jetzt deine Query im Detail angesehen hätte...
Mach dir einen View,
- mit einem Feld in dem Fertigungsauftrag Nr., Atyp und Artikelnummer aneinander"geklebt" sind und gruppier danach
- jeweils SUM für Soll und Ist
und verwende den dann in deinem Query anstatt der "echten" Tabelle
Nicht besonders Performant, aber das ist bei den vielen CASE Statements wahrscheinlich eh schon egal
lg,
Slainte
Moin,
Einfach ein "GROUP BY" auf dein Statement loslassen und mit SUM() arbeiten (ungetestet):
Gruß
em-pie
Zitat von @SlainteMhath:
Mach dir einen View,
- mit einem Feld in dem Fertigungsauftrag Nr., Atyp und Artikelnummer aneinander"geklebt" sind und gruppier danach
- jeweils SUM für Soll und Ist
und verwende den dann in deinem Query anstatt der "echten" Tabelle
nicht erforderlich.Mach dir einen View,
- mit einem Feld in dem Fertigungsauftrag Nr., Atyp und Artikelnummer aneinander"geklebt" sind und gruppier danach
- jeweils SUM für Soll und Ist
und verwende den dann in deinem Query anstatt der "echten" Tabelle
Einfach ein "GROUP BY" auf dein Statement loslassen und mit SUM() arbeiten (ungetestet):
select
fertigungsauftrag.ID as 'Fertigungsauftrag Nr.'
, fertigungsartikel.Artikelnummer as 'Artikelnummer'
, case fertigungsartikel.DetailTyp
when 'V' then 'Verbrauch'
when 'E' then 'Ergebniss'
end as 'Atyp'
, fertigungsartikel.menge * fertigungsbedarf.Bedarfsmenge as 'Soll'
, SUM(case fertigungsartikel.DetailTyp
when 'V' then -1 * lagerprotokoll.Bestand
when 'E' then lagerprotokoll.Bestand
end) as 'Ist'
, SUM(case fertigungsartikel.DetailTyp
when 'V' then (fertigungsartikel.menge * fertigungsbedarf.Bedarfsmenge) - (lagerprotokoll.Bestand * -1)
when 'E' then (fertigungsartikel.menge * fertigungsbedarf.Bedarfsmenge)-(lagerprotokoll.Bestand)
end) as 'Differenz'
from fertigungsartikel
left join produktionsschritt
on fertigungsartikel.ProduktionsschrittID = produktionsschritt.ID
left join fertigungsauftrag
on produktionsschritt.FertigungID = fertigungsauftrag.ID
left Join fertigungsbedarf
on fertigungsbedarf.fertigungsauftragid = fertigungsauftrag.ID
left join werkauftragdetails
on werkauftragdetails.FertigungsartikelID = fertigungsartikel.ID
left join lagerprotokoll
on lagerprotokoll.BELEGPKENNUNG = werkauftragdetails.LagerKennung
where
produktionsschritt.fertigungTyp = '3'
and fertigungsauftrag.ID = '19'
GROUP BY
fertigungsauftrag.ID
, fertigungsartikel.Artikelnummer
, fertigungsartikel.DetailTyp
, fertigungsartikel.menge * fertigungsbedarf.Bedarfsmenge
order by
fertigungsauftrag.ID
, fertigungsartikel.Artikelnummer
Gruß
em-pie
Hallo CreamyCewie,
das mit der Fensterfunktion hat ja akretschmer schon geschrieben. Ist eigentlich ganz einfach, Du mußt nur Deinen Wert "Ist" ersetzen und zwar durch:
Und natürlich auch in der Differenz entsprechend.
Dabei verwendest Du ganz normal das sum (), aber hintendran kommt noch die Gruppierung im "over (partition by ...)". In Deinem Fall habe ich jetzt mal die Artikelnr. angenommen, wenn da noch andere Spalten dazukommen, einfach mit Komma getrennt hintendran schreiben.
Gruß, Mad Max
das mit der Fensterfunktion hat ja akretschmer schon geschrieben. Ist eigentlich ganz einfach, Du mußt nur Deinen Wert "Ist" ersetzen und zwar durch:
sum (case when fertigungsartikel.DetailTyp = 'V' then (lagerprotokoll.Bestand * -1) when fertigungsartikel.DetailTyp = 'E' then lagerprotokoll.Bestand end) over (partition by fertigungsartikel.Artikelnummer) as 'Ist',
Und natürlich auch in der Differenz entsprechend.
Dabei verwendest Du ganz normal das sum (), aber hintendran kommt noch die Gruppierung im "over (partition by ...)". In Deinem Fall habe ich jetzt mal die Artikelnr. angenommen, wenn da noch andere Spalten dazukommen, einfach mit Komma getrennt hintendran schreiben.
Gruß, Mad Max