kompliziertere Datenbankabfrage mit max-Werten

Rosapinguin

Benutzer
Beiträge
6
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.160
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


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
 

ukulele

Datenbank-Guru
Beiträge
4.409
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.
 

Rosapinguin

Benutzer
Beiträge
6
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!
 

Tommi

Datenbank-Guru
Beiträge
284
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
 

akretschmer

Datenbank-Guru
Beiträge
9.160
Hi,

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

Spricht da irgend was gegen, was ich übersehen habe?

Viele Grüße,
Tommi

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

ukulele

Datenbank-Guru
Beiträge
4.409
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.
 
Werbung:

Rosapinguin

Benutzer
Beiträge
6
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!
 
Oben