SQL-Abfrage
Sabine Tg.
- programmiertechnik
0 Frank (no reg)0 EKKi3 Vinzenz Mai
Hallo,
ich bin noch neu im "Geschäft" und stehe vor folgendem Problem:
Tabelle 1
FELD1 FELD2 FELD3 WERT
AA 11 TT 5
AA 33 HH 1
BB 22 CC 3
Tabelle 2
FELD_X FELD_1 Feld_2 Feld_3 Feldwert
BLAU AA 33 HH 100
BLAU BB 22 CC 200
GRÜN AA 11 TT 500
gewünschtes Ergebnis:
Tabelle 3
FELD_X GESAMTWERT
BLAU 2,33 (1 x 100 + 3 x 200 / 300)
GRÜN 3,0 (3 x 500 / 500)
Das programm soll für alle gleichen FELD_X-Werte Feld1 mit Feld_1, Feld2 mit Feld_2... vergleichen und dann beide Werte multiplizieren und gleichzeitig diese Summe durch die Summe des Feldwerts aus Tabelle 2 dividieren.
Ich bin nach 2 Std. Probererei ziemlich am Ende.....
Hi,
ähm, 2,33 ist aber nicht das Ergebnis von (1 x 100 + 3 x 200 / 300), nicht mal annähernd, weil Punktrechnung geht vor Strichrechnung.
Ich bin nach 2 Std. Probererei ziemlich am Ende.....
Wie sehen deine Bemühungen nach den 2 Stunden denn aus?
Ciao, Frank
Mahlzeit Sabine Tg.,
Das programm soll für alle gleichen FELD_X-Werte Feld1 mit Feld_1, Feld2 mit Feld_2... vergleichen und dann
Ja, was dann? Normalerweise soll nach einem Vergleich ENTWEDER eine Aktion gestarten werden, wenn die Vergleichskriterien erfüllt sind ODER eine andere Aktion ausgeführt werden, wenn die Kriterien eben nicht übereinstimmen. Was soll also bei Dir passieren? Und was sind die Vergleichskriterien?
beide Werte multiplizieren und gleichzeitig diese Summe durch die Summe des Feldwerts aus Tabelle 2 dividieren.
Das soll genau WANN passieren (s.o.)?
Ich bin nach 2 Std. Probererei ziemlich am Ende.....
Naja, wenn die Aufgabenstellung so verworren war wie Deine Problembeschreibung, ist das ja auch kein Wunder ... :-)
MfG,
EKKi
Hallo
Tabelle 1
FELD1 FELD2 FELD3 WERT
AA 11 TT 5
AA 33 HH 1
BB 22 CC 3Tabelle 2
FELD_X FELD_1 Feld_2 Feld_3 Feldwert
BLAU AA 33 HH 100
BLAU BB 22 CC 200
GRÜN AA 11 TT 500gewünschtes Ergebnis:
Tabelle 3
FELD_X GESAMTWERT
BLAU 2,33 (1 x 100 + 3 x 200 / 300)
das dürfte (1 x 100 + 3 x 200) / 300 heißen.
GRÜN 3,0 (3 x 500 / 500)
da dürfte ein Fehler sein: GRÜN müsste meiner Meinung nach 5,0 haben.
(5 x 500) / 500
Wenn das so wäre, dann ist das gar nicht so schwierig :-)
Das programm soll für alle gleichen FELD_X-Werte Feld1 mit Feld_1, Feld2 mit Feld_2... vergleichen
also im ersten Schritt ein INNER JOIN über die Felder von Feld 1 bis Feld 3:
SELECT -- Gib mir
T2.FELD_X, -- die Farbe aus Tabelle 2
T1.WERT, -- den Wert aus Tabelle 1
T2.Feldwert -- und den Feldwert aus Tabelle 2
FROM -- aus der
Tabelle1 T1 -- Tabelle 1, die über Alias T1 angesprochen wird
INNER JOIN -- und die mit der
Tabelle2 T2 -- Tabelle 2, die über Alias T2 angesprochen wird
ON -- über die Gleichheit folgender Spalten
T1.FELD1 = T2.FELD_1
AND
T1.FELD2 = T2.Feld_2
AND
T1.FELD3 = T2.Feld_3 -- verknüpft ist
liefert:
FELD_X WERT Feldwert
---------------------
BLAU 1 100
BLAU 3 200
GRÜN 5 500
und dann beide Werte multiplizieren und gleichzeitig diese Summe durch die Summe des Feldwerts aus Tabelle 2 dividieren.
Für den Gesamtwert benötigst Du die berechnete Spalte WERT * Feldwert, also im zweiten Schritt:
SELECT -- Gib mir
T2.FELD_X, -- die Farbe aus Tabelle 2
T1.WERT, -- den Wert aus Tabelle 1
T2.Feldwert, -- und den Feldwert aus Tabelle 2,
T1.WERT * T2.Feldwert -- berechnete Spalte
FROM -- aus der
Tabelle1 T1 -- Tabelle 1, die über Alias T1 angesprochen wird
INNER JOIN -- und die mit der
Tabelle2 T2 -- Tabelle 2, die über Alias T2 angesprochen wird
ON -- über die Gleichheit folgender Spalten
T1.FELD1 = T2.FELD_1
AND
T1.FELD2 = T2.Feld_2
AND
T1.FELD3 = T2.Feld_3 -- verknüpft ist
FELD_X | WERT | Feldwert | WERT * Feldwert
------------------------------------------
BLAU | 1 | 100 | 100
BLAU | 3 | 200 | 600
GRÜN | 5 | 500 | 2500
Im letzten Schritt möchtest Du für jeden unterschiedlichen Wert in der Spalte FELD_X die Summen der berechneten Spalte dividiert durch die Summe der Spalte Feldwert (der einzelnen Datensätze haben), dafür gibt es die GROUP-BY-Klausel und die Aggregatsfunktion SUM, siehe auch SELFHTML aktuell, Datensätze gruppieren mit SQL:
SELECT -- Gib mir
T2.FELD_X, -- die Farbe aus Tabelle 2
SUM(T1.WERT * T2.Feldwert) / SUM(T2.Feldwert) GESAMTWERT
-- und die berechnete Spalte, die über den Namen
-- GESAMTWERT angesprochen wird
FROM -- aus der
Tabelle1 T1 -- Tabelle 1, die über Alias T1 angesprochen wird
INNER JOIN -- und die mit der
Tabelle2 T2 -- Tabelle 2, die über Alias T2 angesprochen wird
ON -- über die Gleichheit folgender Spalten
T1.FELD1 = T2.FELD_1
AND
T1.FELD2 = T2.Feld_2
AND
T1.FELD3 = T2.Feld_3 -- verknüpft ist
GROUP BY -- und gruppiere nach
T2.FELD_X -- der Spalte FELD_X aus Tabelle 2
liefert:
FELD_X | GESAMTWERT
-------------------
BLAU | 2.33
GRÜN | 5
wobei gegebenenfalls sichergestellt werden muss, dass das Ergebnis eine Kommazahl ist.
Ich bin nach 2 Std. Probererei ziemlich am Ende.....
Systematisches Lernen ist besser als Probieren. Die für diese Problemstellung erforderlichen Kenntnisse gehören zum Kern dessen, was man von SQL kennen sollte, wenn man mit SQL arbeiten will.
Freundliche Grüße
Vinzenz
Mahlzeit Vinzenz Mai,
Systematisches Lernen ist besser als Probieren. Die für diese Problemstellung erforderlichen Kenntnisse gehören zum Kern dessen, was man von SQL kennen sollte, wenn man mit SQL arbeiten will.
Vinzenz, ich stelle immer wieder fest, dass Du nicht nur auch die ungewöhnlichsten und schlecht formuliertesten Problemstellungen sehr schnell und (meistens) korrekt analysieren (wobei das "meistens" wiederum meistens daran liegt, dass die Problembeschreibung mangelhaft war und deshalb "Nacharbeiten" erforderlich sind) und in SQL übersetzen kannst, sondern auch noch Deine Abfragen nachvollziehbar kommentierst und sowohl für Laien als auch geübtere Anwender verständlich erläuterst ... ich bin jedesmal mehr als begeistert.
2 Thumbs up!
MfG,
EKKi