Mehrere Einträge in einer Zeile zusammenfassen

Johannes

Neuer Benutzer
Beiträge
3
Guten morgen allerseits,

ich habe folgende Problemstellung und hoffe inständig, dass mir einer helfen kann.

Folgendes Szenario:
Ich habe zwei Tabellen, die ich zusammenführen möchte:

Code:
TabelleA
ID    USERLABEL
1      Kabel1
2      Kabel2
3      Kabel3
4      Kabel4

Code:
TabelleB
ID         TabelleAID          VALUE1          VALUE2         VALUE3
1            1                1                3              4
2            1                3                2              4
3            1                2                4              2
4            2                3                2              2
5            2                1                1              4
6            3                4                4              1
7            3                3                3              1

Bei der Zusammenführung soll eine neue Spalte "Color" definiert werden.
Bei der Kombination Value1=3 AND Value2=2 AND Value3=2 soll diese Spalte den String 'green' beinhalten. Ist die Kombination nicht vorhanden, soll der String 'red' ausgegeben werden.

Bis hierhin sollte das Ganze relativ einfach zu lösen sein. Nur soll für jedes Kabel genau eine Zeile, bzw. ein Eintrag vorhanden sein.
D.h. die SQL Abfrage soll bei einem Kabel, bzw. einer ID prüfen, ob die Wertekombination vorhanden ist. Ist sie vorhanden, gib für "Color" den String 'green' aus und ignoriere alle anderen Kombinationen für diese ID.
Ist diese nicht vorhanden, so gib 'red' aus und ignoriere ebenfalls alle anderen Kombinationen für diese ID.

Das Ergebnis sollte wie folgt aussehen:
Code:
ID   USERLABEL            COLOR
1    Kabel1              red
2    Kabel2              green
3    Kabel3              red
4    Kabel4              red

Kleiner Hinweis: Nicht jede ID von TabellA ist auch in TabelleB vorhanden. In dem Fall soll auch der String 'red' ausgegeben werden.


Momentan sieht meine SQL-Abfrage wie folgt aus:

Code:
SELECT USERLABEL,
  CASE    WHEN VALUE1=3 AND VALUE2=2 AND VALUE3=2
  THEN 'green'
  ELSE 'red'
  END AS COLOR
FROM  TabelleA, TabelleB
WHERE    TabelleA.ID=TabelleB.TabelleAID(+)


Wie erwartet habe ich somit mehrere Zeilen pro Kabel:
Code:
USERLABEL       COLOR
Kabel1            red
Kabel1            red
Kabel1            red
Kabel2            green
Kabel2            red
Kabel3            red
Kabel3            red 
Kabel4            red


Bei jeden weiteren Versuch, die Zeilen zusammenzufassen, bin ich kläglich gescheitert..

Ich hoffe ich habe mein Problem verständlich rübergebracht.
Kann mir jemand weiterhelfen?


Vielen Dank im voraus,
Johannes
 
Zuletzt bearbeitet:
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
Guten morgen allerseits,

ich habe folgende Problemstellung und hoffe inständig, dass mir einer helfen kann.

Johannes


Okay, was zahlst?

Code:
test=*> select * from a;
id | label
----+--------
  1 | label1
  2 | label2
  3 | label3
  4 | label4
  5 | label5
(5 rows)

test=*> select * from b;
id | aid | val1 | val2 | val3
----+-----+------+------+------
  1 |  1 |    1 |    3 |    4
  2 |  1 |    3 |    2 |    4
  3 |  1 |    2 |    4 |    2
  4 |  2 |    3 |    2 |    2
  5 |  2 |    1 |    1 |    4
  6 |  3 |    4 |    4 |    1
  7 |  3 |    3 |    3 |    1
(7 rows)

test=*> select a.id, a.label, coalesce(foo.color,'red') from a left join (select aid, 'green' as color from b where val1=3 and val2=2 and val3=2 union select aid, 'red' from b where not (val1=3 and val2=2 and val3=2)) foo on a.id=foo.aid;
id | label  | coalesce
----+--------+----------
  3 | label3 | red
  1 | label1 | red
  2 | label2 | green
  2 | label2 | red
  5 | label5 | red
  4 | label4 | red
(6 rows)
 

Johannes

Neuer Benutzer
Beiträge
3
Ich kann dich nur mit ewiger Dankbarkeit bezahlen :D

Ähm, ich hätte noch erwähnen sollen, dass ich eine Oracle-DB v8 abfragen muss. Deine LEFT-JOIN Abfrage versuche ich gerade umzusetzen..
Sollte ja eine Syntax wie diese besitzten: SELECT * FROM a, b WHERE a.id=b.aid(+)

select a.id, a.label, coalesce(foo.color,'red') from a
where a.id = b.aid (select aid, 'green' as color from b where val1=3 and val2=2 and val3=2 union select aid, 'red' from b where not (val1=3 and val2=2 and val3=2))foo AND a.id=foo.aid;

Irgendwie sehe ich selber, dass da noch irgendwas nicht passt.. das (+) mit deiner Unterabfrage zu ersetzen ist wohl doch zu einfach gedacht..


Kannst Du mir noch eine Gedankenstütze geben? ;)
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Ich kann dich nur mit ewiger Dankbarkeit bezahlen :D

Was ist mit 'Gefällt mir' drücken? ;-)

Ähm, ich hätte noch erwähnen sollen, dass ich eine Oracle-DB v8 abfragen muss. Deine LEFT-JOIN Abfrage versuche ich gerade umzusetzen..
Sollte ja eine Syntax wie diese besitzten: SELECT * FROM a, b WHERE a.id=b.aid(+)

select a.id, a.label, coalesce(foo.color,'red') from a
where a.id = b.aid (select aid, 'green' as color from b where val1=3 and val2=2 and val3=2 union select aid, 'red' from b where not (val1=3 and val2=2 and val3=2))foo AND a.id=foo.aid;

Irgendwie sehe ich selber, dass da noch irgendwas nicht passt.. das (+) mit deiner Unterabfrage zu ersetzen ist wohl doch zu einfach gedacht..


Kannst Du mir noch eine Gedankenstütze geben? ;)

Du hast jetzt a, b und foo als Tabellen... ich kann es mirt Ora nicht testen weil ich mir das nicht erst extra kaufe ...
 

ukulele

Datenbank-Guru
Beiträge
4.394
Hier mal ein Ansatz der eigentlich direkt unter Orakel gehen sollte:
Code:
SELECT    a.ID,
        a.USERLABEL
        (    CASE
            WHEN    a.ID IN (    SELECT    ID
                                FROM    TabelleB
                                WHERE    ID IS NOT NULL
                                AND        VALUE1=3
                                AND        VALUE2=2
                                AND        VALUE3=2 )
            THEN    'green'
            ELSE    'red'
            END ) AS COLOR
FROM    TabelleA a
Oder, wenn die Einträge in A schon nicht eindeutig sind:
Code:
SELECT    a.ID,
        a.USERLABEL
        (    CASE
            WHEN    a.ID IN (    SELECT    ID
                                FROM    TabelleB
                                WHERE    ID IS NOT NULL
                                AND        VALUE1=3
                                AND        VALUE2=2
                                AND        VALUE3=2 )
            THEN    'green'
            ELSE    'red'
            END ) AS COLOR
FROM    (    SELECT    DISTINCT
                    ID,
                    USERLABEL
            FROM    TabelleA ) a
 
Werbung:

Johannes

Neuer Benutzer
Beiträge
3
Ich kann euch gar nicht sagen, wie dankbar ich euch bin. Ich sitze bestimmt schon seit einer Woche an dem Problem, hab' es mit NOT EXISTS oder mit CONCAT probiert, nur leider ohne Erfolg..

@ukulele: ich habe deine Abfrage noch geringfügig angepasst und sie funktioniert wunderbar:
Code:
SELECT    a.ID,   a.USERLABEL,
           CASE   WHEN    a.ID IN
          (    SELECT    ID
               FROM    TabelleB
               WHERE    ID IS NOT NULL
               AND        VALUE1=3
               AND        VALUE2=2
               AND        VALUE3=2 )
           THEN    'green'
           ELSE    'red'
          END  AS COLOR
FROM   TabelleA

@akretschmer: Den Gefällt-mir Button habe ich bis jetzt schlichtweg übersehen. Ich habe mich auch erst heute morgen hier angemeldet.

Also nochmal: Vielen Dank euch beiden ;)
 
Oben