Sabine Tg.: SQL-Abfrage

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.....

  1. 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

  2. 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

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  3. 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

    1. 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

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|