Update von 3 Feldern gleichzeitig

bytewarrier

Grünschnabel
Hallo,
ich möchte gerne in einer Tabelle 3 Felder updaten, und zwar mit den jeweils gefundenen Werten aus einer anderen Tabelle.
Also ich habe folgende 3 Felder
BU|FSDD_VALUE_ID_1|FSDD_KPI_LEVEL_ID|FSDD_KPI_LEVE L_NAME|FSDD_KPI_TARGET
710000|16|<NULL>|<NULL>|<NULL>|

Die andere Tabelle hat folgende Einträge
BU|VALUE_LEVEL_1_ID|VALUE_LEVEL_1_NAME|VALUE_LEVEL _2_ID|VALUE_LEVEL_2_NAME|VALUE_LEVEL_3_ID|VALUE_LE VEL_3_NAME|VALUE_LEVEL_KPI_TARGET

71000 15 High 10 Medium 5 Low 14
72000 90 High 45 Medium 20 Low 100

Ich möchte jetzt folgendes erreichen
Die Tabelle 1 soll mittels join mit der zweiten Tabelle verbunden werden.
Key ist
BU = BU
Anhand des Wertes aus Spalte FSDD_VALUE_ID_1 der Tabelle 1 soll nun der entsprechende gegenwert gefunden werden mittels Case und >= .
In meinem fall würde er den Ersten Satz finden und die beiden Werte
15 und HIGH
Diese Werte sollen nun in die tabelle 1 geschrieben werden, ebenso der Wert 14, was in das Feld VALUE_LEVEL_KPI_TARGET soll.

Hoffe es war nicht zu verwirrend, ich gebe auch gerne weiter Auskunft, ich hoffe nur, dass wir das hinkriegen.
Danke
 
Was wie Verbunden werden soll, ist sehr verwirrend. Ich versuchs mal. Wobie der >= ist ejikel. Du solltest darauf auchten, dass wenn du dasselbe als SELECT schreibst, die Tabellen1-Einträge nicht mehrfach vorkommen.

In MySQL würde das etwa so aussehen (sofern ich dich richtig verstanden habe) (Wenn du eine andere Datenbank als MySQL hast, dann fühl dich frei uns dies mitzuteilen)
SQL:
UPDATE
	table1 AS t1, 
	table2 AS t2
SET
	t1.FSDD_KPI_LEVE_L_NAME = t2.VALUE_LEVEL_1_NAME,
	t1.FSDD_KPI_TARGET = t2.VALUE_LEVEL_KPI_TARGET
WHERE
	t1.BU = t2.BU
	AND t1.FSDD_VALUE_ID_1 >= t2.VALUE_LEVEL_1_ID;
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
ich habe das jetzt wiefolgt gelöst
Update f_sd_detail
set (FSDD_KPI_LEVEL_NAME ,fsdd_kpi_target_1) =
(select
CASE
When FSDD_KPI_VALUE_1 >= Value_level_1_ID then Value_level_1_name
when FSDD_KPI_VALUE_1 >= Value_level_2_ID then Value_level_2_name
when FSDD_KPI_VALUE_1 >= Value_level_3_ID then Value_level_3_name
else 'NV'
END , value_level_kpi_target
from
parametertabelle,
f_sd_master,
f_sd_detail
where
f_sd_detail.fsdd_demp_ID = f_sd_master.fsdm_demp_id and
parametertabelle.value_level_id = f_sd_master.fsdm_bu_id
);

Funktioniert prima.

Die einzigste herausvorderung ist jetzt noch, dass ich zwischen den beiden Feldern
FSDD_KPI_LEVEL_NAME ,fsdd_kpi_target_1 ein weiteres Feld einfügen möchte, welches es upzudaten gilt.
Das einzigste problem dabei ist, dass auch hier ein Case zu verwenden ist, der aber dem ersten entspricht.
Das heißt das Zweite Feld ist genauso in Abhängigkeit zu setzen wie das erste
Der case würde dann so aussehen
CASE
When FSDD_KPI_VALUE_1 >= Value_level_1_ID then Value_level_1_ID
when FSDD_KPI_VALUE_1 >= Value_level_2_ID then Value_level_2_ID
when FSDD_KPI_VALUE_1 >= Value_level_3_ID then Value_level_3_ID

Meine Frage lautet:
Kann ich mir dieses Case sparen und das irgendwie in das obere case mit einbauen,
da die Bedingung ja gleich bleibt.

Ich dachte an so etwas
CASE
When FSDD_KPI_VALUE_1 >= Value_level_1_ID then Value_level_1_name , VALUE_LEVEL_3_ID
when FSDD_KPI_VALUE_1 >= Value_level_2_ID then Value_level_2_name , VALUE_LEVEL_2_ID
when FSDD_KPI_VALUE_1 >= Value_level_3_ID then Value_level_3_name , VALUE_LEVEL_1_ID
else 'NV'

Aber das passt ja von der Syntax nicht.
danke
 
Damit es nicht zu kompliziert wird, würd ich eine View mchen, die deine parameterdaten anständig aufreit, damit man nachher einfacher damit arbeiten kann. (Crosstable)

SQL:
CREATE OR REPLACE VIEW v_parameter AS
SELECT
	BU AS bu,
	1 AS level,
	VALUE_LEVEL_1_ID AS value_id, 
	99999999999 AS value_id_to, 
	VALUE_LEVEL_1_NAME AS value_name
FROM
	parametertabelle
UNION SELECT
	BU AS bu,
	2 AS level,
	VALUE_LEVEL_2_ID AS value_id, 
	VALUE_LEVEL_1_ID-1 AS value_id_to, 
	VALUE_LEVEL_2_NAME AS value_name
FROM
	parametertabelle
UNION SELECT
	BU AS bu,
	3 AS level,
	VALUE_LEVEL_3_ID AS value_id, 
	VALUE_LEVEL_2_ID-1 AS value_id_to, 
	VALUE_LEVEL_3_NAME AS value_name
FROM
	parametertabelle;
UNION SELECT
	BU AS bu,
	0 AS level,
	0 AS value_id, 
	VALUE_LEVEL_3_ID-1 AS value_id_to, 
	'NV' AS value_name
FROM
	parametertabelle;

Anschliessend kann man mit between arbeiten, was das ganze wesentlich vereinfacht
SQL:
UPDATE 
	f_sd_detail AS d, 
	v_parameter AS p
SET
	d.FSDD_KPI_LEVEL_ID = p.value_id
	d.FSDD_KPI_LEVEL_NAME = p.value_name
WHERE
	d.bu = p.bu
	AND d.FSDD_KPI_VALUE_1 BETWEEN p.value_id AND p.value_id_to;
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

an und für sich keine schlechte Idee, aber wir dürfen leider keine views anlegen.
Daher muss ich hier mittels Update arbeiten.

Geht das denn nicht so wie ich es vorher beschrieben habe?
 
Hab da was schönes gefunden INTERVAL() und ELT(). Das macht es schön kurz.

SQL:
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	
FROM
	(SELECT
                b.*,
		d.bu,
		INTERVAL(d.FSDD_KPI_VALUE_1, p.Value_level_3_ID, p.Value_level_2_ID, p.Value_level_1_ID) AS lpos
	FROM
		f_sd_detail AS d,
		parametertabelle AS p
	WHERE
		d.bu = p.bu
	) AS source
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

super wenn da klappen könnte.
wie würde das denn in meinem UPDATE Statement aussehen.
Kenne mich da leider etwas zu wenig aus.
Danke
 
Hab grad noch b.* im Subquery hinzugefügt....

Anchtrag:
etwa so
SQL:
Update f_sd_detail
	set (FSDD_KPI_LEVEL_NAME ,fsdd_kpi_target_1) =
			(SELECT 
				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	
			FROM
				(SELECT
					d.bu,
					INTERVAL(d.FSDD_KPI_VALUE_1, p.Value_level_3_ID, p.Value_level_2_ID, p.Value_level_1_ID) AS lpos
				FROM
					f_sd_detail AS d,
					parametertabelle AS p
				WHERE
					d.bu = p.bu
				) AS source
			WHERE
				source.BU = f_sd_detail.BU)
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

ist ziemlich kompliziert.
was macht denn eigentlich INTERVAL und ELT.

Die kenne ich noch gar nicht.

Achso, irgendwo scheint da noch eine rechte klammer zu fehlen.
Danke
 
Hallo nochmal,
ich glaube nicht so ganz, dass ich mein Problem damit lösen kann.
Also vielleicht war mein Eingangsproblem nicht gut genaug beschrieben.

Also es geht um folgendes
Ich habe eine Faktentabelle, in der Kennzahlen aufgelistet sind.
eine kennzahl kann zum Beispiel die Anzahl der Kontakte je Mitarbeiter sein.
Diese steht im Feld FSDD_KPI_VALUE_1
Anhand der BU soll nun in der PARAMETERTABELLE nachgeschaut werden, welches Ziel er erreicht hat, z:B LOW HIGH oder MEDIUM.
Dieser Text steht in der PARAMETERTABELLE drinnen.
Neben dem Text soll auch der Schwellwert übernommen werden.
Also nehmen wir mal an, der Mitarbeiter hat 15 Kontakte erzielt.
In der Parametertabelle stehen folgende Einträhe
10 LOW
14 MEDIUM
20 HIGH

Anhand meines Case habe ich nun z.B den Wert 14 zurückgeliefert bekommen, der dann in meine Faktentabelle zurückgeschrieben wird.
das gleiche soll aber auch mit dem Wort Medium passieren.
Muss ich hier den Case nochmals Durchführen?
danke
 

Neue Beiträge

Zurück