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

Gruppieren und Abfragen nach Wertemenge

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von tScheckSn, 11 November 2014.

  1. tScheckSn

    tScheckSn Neuer Benutzer

    Hallo,
    Ich hab wieder einmal ein Problem:
    Ausgangspunkt ist eine eine Tabelle, in der verschidene ValueID's einer Wertemenge zugeordnet werden.

    Tabelle:

    Value (int) | BelongsTo (int)
    1 | 11
    1 | 17
    1 | 18
    2 | 11
    2 | 17
    3 | 11
    4 | 18


    Es soll nach Value gruppiert werden und alle Values ausgegeben werden, wo alle BelongsTo in der Wertemenge 15,20,11,17 vorkommen.

    Ein par Beispiele:
    ---------------------------------
    Wertemenge: 15,20,11,17
    Ergebnis:
    2
    3
    4
    ---------------------------------
    Wertemenge: 18
    Ergebnis:
    4

    ---------------------------------
    Wertemenge: 17
    Ergebnis:
    Keine Rückgabe, da er nur in Kombination mit 11 und 18 gültig ist.

    ---------------------------------
    Wertemenge: 11,17,18
    Ergebnis:
    1
    2
    3
    4


    Eine Zusatzfrage:
    Habt ihr einen Tipp für mich, wie man dann noch aus den Integerwerten einen String bilden kann in folgender Form:

    (Letztes Beispiel)
    Werte: 11,17,18
    Ergebnis:
    1 | "11+17+18"
    2 | "11+17"
    3 | "11+"
    4 | "18+"

    Danke für eure Hilfe!
    Liebe Grüße
     
  2. akretschmer

    akretschmer Datenbank-Guru


    So ganz scheinen Deine Beispiele nicht zu stimmen. Mit PostgreSQL

    Code:
    test=*# select * from tschecksn ;
     val | b   
    -----+----   
      1 | 11   
      1 | 17   
      1 | 18
      2 | 11
      2 | 17
      3 | 11
      4 | 18
    (7 rows)
    
    Time: 0,180 ms
    test=*# select val from (select val, array_agg(b) as my_array from tschecksn group by val) foo where array[11,17,18] @> my_array;
     val
    -----
      1
      2
      3
      4
    (4 rows)
    
    Time: 0,334 ms
    test=*# select val from (select val, array_agg(b) as my_array from tschecksn group by val) foo where array[17] @> my_array;
     val
    -----
    (0 rows)
    
    Time: 0,330 ms
    test=*# select val from (select val, array_agg(b) as my_array from tschecksn group by val) foo where array[18] @> my_array;
     val
    -----
      4
    (1 row)
    
    Time: 0,330 ms
    test=*# select val from (select val, array_agg(b) as my_array from tschecksn group by val) foo where array[15,20,11,17] @> my_array;
     val
    -----
      2
      3
    (2 rows)
    
    Time: 0,334 ms
    test=*#
    
    Deine Zusatzaufgabe, auch mit PG:

    Code:
    test=*# select val, array_to_string(array_agg(b),'+') from tschecksn group by val ;
     val | array_to_string
    -----+-----------------
      1 | 11+17+18
      2 | 11+17
      3 | 11
      4 | 18
    (4 rows)
    
    Vielleicht findest ja ähnliche Funktionen.
     
  3. tScheckSn

    tScheckSn Neuer Benutzer

    Am SQL Server funktioniert diese abfrage leider nicht: "array_agg" wird nicht als Name iner integrierten Funktion erkannt.
    Gibts da irgend welche alternativen?

    Danke!
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Ja, das ist PostgreSQL. Ich kenne M$SQL nicht, vielleicht findest ja in der Doku oder zu eine Alternative. Array_agg() ist einfach eine Aggregation, in MySQL heißt das wohl group_concat() oder so. PostgreSQL hat halt wirklich viele Funktionen und Features, die teilweise doch weit über das gehen, was andere Datenbanken können.
     
  5. ukulele

    ukulele Datenbank-Guru

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