PDA

View Full Version : SQL Update Case Berechnung



Holzwurm1973
27-09-17, 14:39
Schönen guten Tag,

ich hätte da eine Sorge bei der Ihr mir vielleicht helfen könnt.
Da unsere User die Eingaben nicht gewissenhaft auf die Kette bekommen würde ich gerne
ein Eingabefeld regelmäßig per SQL korrigieren.:


select
case
when b.tme in ('St','ST') and a.vvolpe != round(decimal((a.vmasl*(a.vmasb/100)*(a.vmass/1000)), 15, 6), 6) then round(decimal((a.vmasl*(a.vmasb/100)*(a.vmass/1000)), 15, 6), 6)
when b.tme='m' and (a.vvolpe != round(decimal(((a.vmasb/100)*(a.vmass/1000)), 15, 6), 6) and a.vmasb!='0' and a.vmass!='0') then round(decimal(((a.vmasb/100)*(a.vmass/1000)), 15, 6), 6)
when b.tme='m2' and a.vmass!='0' and a.vvolpe != round(decimal((a.vmass/1000), 15, 6), 6) then round(decimal((a.vmass/1000), 15, 6), 6)
when b.tme='m3' and a.vvolpe != '1.000000' then '1.000000' end Berechnung -- zu änderndes Feld
from kd.yarv a
join kd.yar b on b.artn=a.vartn
where (a.arvlv='' and a.arvsv='') and (b.arlv='' and b.arsv='')
and b.tarst1 in ('1','2', '3','4','5','6','7','8','9','H')
and a.vartnv not in ('FIX', 'ZUS')
and b.tat1 not like ('%Rohfix%') and tat2 not like ('%Rohfix%')
and (b.tat2 not like ('%sonst%') and b.tat1 not like ('%sonst%'))
and(
(b.tme in ('St','ST') and a.vvolpe != round(decimal((a.vmasl*(a.vmasb/100)*(a.vmass/1000)), 15, 6),6) and (a.vmasl!='0' and a.vmasb!='0' and a.vmass!='0') ) or
(b.tme='m' and (vvolpe != round(decimal(((a.vmasb/100)*(a.vmass/1000)), 15, 6), 6) and a.vmasb!='0' and a.vmass!='0')) or
(b.tme='m2' and a.vvolpe != round(decimal((a.vmass/1000), 15, 6), 6) and a.vmass!='0' ) or
(b.tme='m3' and vvolpe != '1')
)

In diesem Fall geht es um das Volumen im Artikelstamm welches entsprechend berechnet werden und im Fall der Abweichung ersetzt werden soll.
Leider bekomm ich immer die Meldung: "Unterabfrage ergab mehr als eine Zeile..."

Mein herzlichen Dank im voraus.

Robi
27-09-17, 14:42
Kannst du nicht stattdessen einen Trigger die Daten immer richtig schreiben lassen!
Sporadisch ein Korrektur sql ist duch 'sub-Optimal'


zu deinem SQL ...
mehr als eine Zeile sagt doch alles ...
Du mußt genauer selektiern oder mit max() bzw min() arbeiten

Robi

Fuerchau
27-09-17, 14:49
Dein Problem ist ggf. dass der Join mehr als 1 Zeile erzeugt, d.h., dass artn nicht eindeutig ist.
Das solltest du aber beim Select schon feststellen.

Wenn du nun einen Update schreibst, musst du bedenken, dass du ggf. sowieso für jeden Satz einen Update machst.
Um nur die falschen upzudaten benötigst du die Berechnung nämlich 2x!

update myfile
set feld = (Berechnungs-Select)
where feld <> (Berechnungs-Select)

Für den (Berechnungs-Select) lohnt sich in diesem Fall ggf. schon eine SQL-Function.

Langfristig gebe ich meinem Vorredner recht, dass ein Trigger da eher hilft.