Vinzenz Mai: SQL-Abfrage

Beitrag lesen

Hallo

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)

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