Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

kompliziertere Datenbankabfrage mit max-Werten

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Rosapinguin, 15 Januar 2013.

  1. Rosapinguin

    Rosapinguin Benutzer

    Hallo Zusammen,

    Ich habe zwei Datenbanken, die ich zunächst miteinander verknüpfen möchte:

    Tabelle A

    TabelleA-ID | Wert A

    1 | AB
    2 | CD

    Tabelle B

    TabelleA-ID | Wert B | Wert C

    1 | KH | 20
    1 | KH | 10
    1 | VK | 20
    1 | VK | 10
    2 | KH | 20
    2 | KH | 10
    2 | VK | 20
    2 | VK | 10

    Was ich nun sehen möchte ist folgende Tabelle:

    TabelleB-ID | Wert A | Wert B (KH) | Wert C (KH) | Wert B (VK) | Wert C (VK)

    1 | AB | KH | 20 | VK | 20
    2 | CD | KH | 20 | VK | 20


    Das heißt ich brauche den höhsten Wert für C aus Tabelle B verknüpft mit Wert B und der ID aus Tabelle A.

    select distinct TabelleA-ID,Wert A, a.Wert B as "Wert B (KH)", a.Wert C as "Wert C (KH)",b.Wert B as "Wert B (VK)", b.Wert C as "Wert C (VK)"from Tabelle A
    left join Tabelle B a on TabelleA-ID = TabelleB-ID and a.Wert B = 'KH'
    left join Tabelle B b on TabelleA-ID = TabelleB-ID and b.Wert B = 'VK'

    Durch die obere Abfrage kriege ich es hin, dass die Werte schonmal in einzelnen Spalten stehen, doch die Werte sind noch doppelt:

    TabelleB-ID | Wert A | Wert B (KH) | Wert C (KH) | Wert B (VK) | Wert C (VK)

    1 | AB | KH | 20 | VK 20
    1 | AB | KH | 10 | VK 10
    1 | AB | KH | 20 | VK 10
    1 | AB | KH | 10 | VK 20
    2 | CD | KH | 20 | VK 20
    2 | CD | KH | 10 | VK 10
    2 | CD | KH | 20 | VK 10
    2 | CD | KH | 10 | VK 20

    Und das würde ich gerne Wegbekommen. Ich möchte nur die Kombination KH = 20 und VK = 20 sehen.

    Hat hier jemand eine Idee???

    Vielen Dank und beste Grüße
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Wenn Du erst einmal:

    Code:
    test=*# select id, wert_b, max(wert_c) from b group by id, wert_b;
     id | wert_b | max
    ----+--------+-----
      1 | KH     |  20
      1 | VK     |  20
      2 | VK     |  20
      2 | KH     |  20
    (4 rows)
    
    ermittelst und damit Deinen obigen JOIN machst, solltest Du bekommen, was Du suchst.
    Allerdings habe ich ein ungutes Gefühl, was das DB-Schema betrifft ...

    Andreas
     
  3. ukulele

    ukulele Datenbank-Guru

    Code:
    SELECT    a.TabelleA-ID,
            a.[Wert A],
            b.[Wert B],
            b.[Wert C],
            c.[Wert B],
            c.[Wert C]
    FROM    [Tabelle A] a
    LEFT JOIN    (    SELECT    TabelleA-ID,
                            [Wert B],
                            max([Wert C]) AS [Wert C]
                    FROM    [Tabelle B]
                    WHERE    [Wert B] = 'KH'
                    GROUP BY TabelleA-ID,[Wert B] ) b
    ON        b.TabelleA-ID = a.TabelleA-ID
    LEFT JOIN    (    SELECT    TabelleA-ID,
                            [Wert B],
                            max([Wert C]) AS [Wert C]
                    FROM    [Tabelle B]
                    WHERE    [Wert B] = 'VK'
                    GROUP BY TabelleA-ID,[Wert B] ) c
    ON        c.TabelleA-ID = a.TabelleA-ID
    So könnte es klappen, es gibt aber viele Wege zur Lösung. Eventuell auch schnellere. Gut wäre es sicherlich, den Subselect im Join in eine eigene View auszulagern.
     
  4. Rosapinguin

    Rosapinguin Benutzer

    Hallo ukulele,

    Das funktioniert wunderbar!! Danke!
    Ja ein eigener View wäre sicherlich "schöner", aber diese Abfrage ist nur ein kleiner Teil meiner Gesamtabfrage, die einem Schritt auführbar sein sollte. aber so funktioniert es auf jeden Fall erstmal!
     
  5. Tommi

    Tommi Datenbank-Guru

    Hi,

    wenn HK und VK soundso fest abgefragt und somit vorgegeben sind, warum dann nicht so ?

    Code:
    SELECT A.[TabelleA-ID], A.[Wert A],
    'KH' as [Wert B (KH)],
    MAX(CASE WHEN B.[Wert B]='KH' THEN B.[Wert C] ELSE NULL END) as [Wert C (KH)],
    'VK' as [Wert B (VK)],
    MAX(CASE WHEN B.[Wert B]='VK' THEN B.[Wert C] ELSE NULL END) as [Wert C (VK)]
    FROM [Tabelle A] A
    LEFT OUTER JOIN [Tabelle B] B
         ON A.[TabelleA-ID]=B.[TabelleA-ID]
    GROUP BY A.[TabelleA-ID], A.[Wert A]
    
    Spricht da irgend was gegen, was ich übersehen habe?

    Viele Grüße,
    Tommi
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Tja, das waren auch so meine Überlegungen. Nur - warum Dinge in einer DB speichern, die eh 'fix' sind? Daher auch meine abschließende Bemerkung...
     
  7. ukulele

    ukulele Datenbank-Guru

    Es kann ja neben VK und HK noch andere Werte in der Tabelle in einer beliebigen Anzahl geben, ganz abwegig ist das nicht. Vieleicht werden Herstellungskosten, Entwicklungskosten, Verkaufspreise über einen Zeitraum verglichen und hier sollen irgendwelche Maximalwerte übersichtlich dargestellt werden, vieleicht ist die DB aber auch von einem PHP-Programierer "on the fly" designt worden - Spekulation und erstmal unerhelbich, solange sich kein Umbau des bestehenden Systems anbietet.
     
    akretschmer gefällt das.
  8. Rosapinguin

    Rosapinguin Benutzer

    Hallo zusammen,

    In der Tabelle gibt es definitiv noch andere Werte, die eine Zuordnung erschweren. Leider sind manche Tabellen tatsächlich "on the fly" designt worden. so kann man bei den anderen Tabellen eigentlich über einen Status verlinken, d.h. Werte die Aktuell sind haben Status x und historische Werte Status y. aber in dieser Tabelle hatte alles Status x. Weswegen diese Lösung zwar unsauber ist, mich aber erstmal an mein Ziel bringt. :) Tja man kann sich seine Datenbank nicht aussuchen :)

    Danke nochmal an Alle fürs Mithelfen!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden