creamycewie
Goto Top

TSQL - Referenzierung auf vorherigen Datensatz

Hallo Leute.

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
19Verbrauch010KEU0060422002000
19Verbrauch010KEU0060422005195
19Verbrauch010KEU0130153003000
19Ergebniss050STA0801401008515

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
19Verbrauch010KEU0060422002055

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

Content-ID: 665671

Url: https://administrator.de/contentid/665671

Ausgedruckt am: 26.11.2024 um 15:11 Uhr

SlainteMhath
SlainteMhath 13.04.2021 um 08:28:35 Uhr
Goto Top
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 face-smile

lg,
Slainte
CreamyCewie
CreamyCewie 13.04.2021 um 08:55:14 Uhr
Goto Top
Danke für den Denkansatz, wie mache ich einen View?
akretschmer
akretschmer 13.04.2021 um 08:59:21 Uhr
Goto Top
mittels CREATE VIEW ...
CreamyCewie
CreamyCewie 13.04.2021 um 09:20:03 Uhr
Goto Top
Aber nur fürs Verständniss, der View bringt mir doch für die Gruppierung nichts, weil ich ja trotzdem unterschiedliche Kennungen im Feld lagerprotokoll.BELEGPKENNUNG habe, oder?
akretschmer
akretschmer 13.04.2021 um 09:23:01 Uhr
Goto Top
vermutlich. Deinem Betreff nach zu urteilen suchst Du WINDOW-Funktionen, um auf vorherige/nachfolgende Zeilen zuzugreifen. Aus Deiner Abfrage mittels reverse engineering nun die einzelnen Tabellen zu rekonstruieren bin ich schlicht zu faul.
em-pie
em-pie 13.04.2021 um 12:08:07 Uhr
Goto Top
Moin,

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.

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
MadMax
MadMax 13.04.2021 um 19:38:05 Uhr
Goto Top
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:
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