Also, ich habe mal die Tabellen aufgrund deines Eingangspostings erstellt und abgefüllt.
Dann mein SQL getestet, alle Fehler behoben und bin daraufhin auf das unten stehende SQL gekommen.
Das Resultat sieht dann so aus
BU FSDD_VALUE_ID_1 FSDD_KPI_LEVEL_ID FSDD_KPI_LEVEL_NAME FSDD_KPI_TARGET
710000 16 15 High 14
Es ist nicht wirklich kompliziert
INTERVAL: http://dev.mysql.com/doc/refman/5.1/de/comparison-operators.html ->INTERVAL()
gibt die Position zurück.
ELT: http://dev.mysql.com/doc/refman/5.1/de/string-functions.html _> ELT()
nimmt anhand eines Index einen Wert aus einer Liste
Zuerst bestimme ich an die Position innerhlab der Auflistung
Ich beginne extra mit Level 3, da die Werte aufsteigend sein müssen und bei dir sind sie absteigend.
Anschliessend gehe ich mit dieser Position in die Auflistung zurück um den Wert auszulesen
Da 0 auch hier 0 zurückgibt, muss ich nix spezielles machen um die 'NV'-ID zu evaluieren.
Beim Text sieht es anders aus. Da schiebe ich ein 'NV' vorne rein und versetze dementsprechend die position um 1. Wenn der Wert 0 ist, nimmt er mir so den ersten Wert, also 'NV'.
Dann das alles als noch mit der Update-Tabelle verknüpfen und die SET richtig schreiben. Fertig ist der Zauber.
Dann mein SQL getestet, alle Fehler behoben und bin daraufhin auf das unten stehende SQL gekommen.
Das Resultat sieht dann so aus
BU FSDD_VALUE_ID_1 FSDD_KPI_LEVEL_ID FSDD_KPI_LEVEL_NAME FSDD_KPI_TARGET
710000 16 15 High 14
SQL:
Update
f_sd_detail,
(SELECT
BU,
ELT(pos+1, 'NV', Value_level_3_name, Value_level_2_name, Value_level_1_name) AS level_name,
ELT(pos, Value_level_3_ID, Value_level_2_ID, Value_level_1_ID) AS level_id ,
VALUE_LEVEL_KPI_TARGET
FROM
(SELECT DISTINCT
p.*,
INTERVAL(d.FSDD_VALUE_ID_1, p.Value_level_3_ID, p.Value_level_2_ID, p.Value_level_1_ID) AS pos
FROM
f_sd_detail AS d,
parametertabelle AS p
WHERE
d.bu = p.bu
) AS position
) AS newValues
SET
FSDD_KPI_LEVEL_NAME = newValues.level_name,
FSDD_KPI_LEVEL_ID = newValues.level_id,
FSDD_KPI_TARGET = newValues.VALUE_LEVEL_KPI_TARGET
WHERE
newValues.BU = f_sd_detail.BU
Es ist nicht wirklich kompliziert
INTERVAL: http://dev.mysql.com/doc/refman/5.1/de/comparison-operators.html ->INTERVAL()
gibt die Position zurück.
ELT: http://dev.mysql.com/doc/refman/5.1/de/string-functions.html _> ELT()
nimmt anhand eines Index einen Wert aus einer Liste
Zuerst bestimme ich an die Position innerhlab der Auflistung
SQL:
INTERVAL(d.FSDD_VALUE_ID_1, p.Value_level_3_ID, p.Value_level_2_ID, p.Value_level_1_ID) AS pos
Anschliessend gehe ich mit dieser Position in die Auflistung zurück um den Wert auszulesen
SQL:
ELT(pos, Value_level_3_ID, Value_level_2_ID, Value_level_1_ID) AS level_id
Da 0 auch hier 0 zurückgibt, muss ich nix spezielles machen um die 'NV'-ID zu evaluieren.
Beim Text sieht es anders aus. Da schiebe ich ein 'NV' vorne rein und versetze dementsprechend die position um 1. Wenn der Wert 0 ist, nimmt er mir so den ersten Wert, also 'NV'.
SQL:
ELT(pos+1, 'NV', Value_level_3_name, Value_level_2_name, Value_level_1_name) AS level_name
Dann das alles als noch mit der Update-Tabelle verknüpfen und die SET richtig schreiben. Fertig ist der Zauber.
Zuletzt bearbeitet von einem Moderator: