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

Mehrere Einträge in einer Zeile zusammenfassen

Dieses Thema im Forum "Oracle" wurde erstellt von Johannes, 12 November 2013.

  1. Johannes

    Johannes Neuer Benutzer

    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: 12 November 2013
  2. akretschmer

    akretschmer Datenbank-Guru


    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 gefällt das.
  3. Johannes

    Johannes Neuer Benutzer

    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? ;)
     
  4. akretschmer

    akretschmer Datenbank-Guru

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

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

    ukulele Datenbank-Guru

    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
     
    Johannes gefällt das.
  6. Johannes

    Johannes Neuer Benutzer

    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 ;)
     
    akretschmer gefällt das.
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