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

SELECT: Mehrere Zeilen zusammenfassen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Armas, 14 September 2016.

  1. Armas

    Armas Neuer Benutzer

    Hey :)
    und zwar steh ich bei einer Aufgabe grade echt auf dem Schlauch: und zwar soll ich alle Ansprechpartner anzeigen lassen, die genau 3 Telefonnummern haben (soweit kein Problem). Jedoch sollen alle 3 Telefonnummern in einer Zeile (siehe Bild) ausgegeben werden. Wie kann ich mir jetzt noch die 2 Telefonnummer anzeigen lassen?

    upload_2016-9-14_9-47-59.png

    So sieht der Code bis jetzt aus:

    Code:
    SELECT t1.as_id
           ,t1.as_name
           ,t1.as_vorname
           ,MIN(t2.ak_kommunikation) AS Telefon1
           ,'' AS Telefon2
           ,MAX(t2.ak_kommunikation) AS Telefon3
           ,COUNT(*) AS Anzahl
    
    FROM aa_ansprechpartner AS t1
    
    INNER JOIN aa_kommunikation AS t2
           ON t1.as_id = t2.ak_asp_id
           AND t2.ak_kom_art = 'Telefon'
    GROUP BY t1.as_id
                 ,t1.as_name
                 ,t1.as_vorname
    HAVING (COUNT(t2.ak_kommunikation)=3)
    Bin für jeden Lösungsvorschlag sehr dankbar :)

    Mit freundlichen Grüßen
    Armas
     
  2. ukulele

    ukulele Datenbank-Guru

    Eine Möglichkeit wäre
    Code:
    WITH t3 AS (
       SELECT   t1.as_id,
           t1.as_name,
           t1.as_vorname
       FROM   aa_ansprechpartner t1
       INNER JOIN aa_kommunikation t2
       ON     t1.as_id = t2.ak_asp_id
       AND     t2.ak_kom_art = 'Telefon'
       GROUP BY t1.as_id,
           t1.as_name,
           t1.as_vorname
       HAVING count(t2.ak_kommunikation) = 3
       ), t5 AS (
       SELECT   ROW_NUMBER() OVER (PARTITION BY t4.ak_asp_id ORDER BY t4.ak_kommunikation) AS zeile,
           t4.ak_asp_id,
           t4.ak_kommunikation
       FROM   aa_kommunikation t4
       WHERE   t4.ak_kom_art = 'Telefon'
       )
    SELECT   t3.*,
         t51.ak_kommunikation AS Telefon1,
         t52.ak_kommunikation AS Telefon2,
         t53.ak_kommunikation AS Telefon3
    FROM   t3
    LEFT JOIN t5 t51
    ON     t3.as_id = t51.ak_asp_id
    AND     t51.zeile = 1
    LEFT JOIN t5 t52
    ON     t3.as_id = t52.ak_asp_id
    AND     t51.zeile = 2
    LEFT JOIN t5 t53
    ON     t3.as_id = t53.ak_asp_id
    AND     t51.zeile = 3
    Es gibt aber sicherlich weitere :)
     
  3. Armas

    Armas Neuer Benutzer

    Vielen Dank für die schnelle Antwort! :)

    Leider zeigt er mir NULL Werte bei T.nr2 und T.nr3 an:

    upload_2016-9-14_10-33-20.png
    (Er zeigt die NULL Werte bei jeder Zeile an)

    Zur Information: Ich befinde mich auf einer Testdatenbank und die Daten sind alles andere als sauber: sprich in den Telefonnummern können auch Buchstaben u.ä. vorkommen.
     
  4. ukulele

    ukulele Datenbank-Guru

    Also
    Code:
      SELECT   ROW_NUMBER() OVER (PARTITION BY t4.ak_asp_id ORDER BY t4.ak_kommunikation) AS zeile,
           t4.ak_asp_id,
           t4.ak_kommunikation
       FROM   aa_kommunikation t4
       WHERE   t4.ak_kom_art = 'Telefon'
    ORDER BY 2,1
    
    ...müsste dir alle "Telefonnummern" sortiert nach FK und mit einer Zeilennummer versehen ausgeben. Da dürften keine NULL Werte stehen, könnten aber natürlich. Dann wäre es aber ein Problem der vorhandenen Daten und ließe sich mit AND t4.ak_kommunikation IS NOT NULL vorrübergehend lösen.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    angenommen, Du hast:

    Code:
    test=*# select * from ansprechpartner ;
     name
    ------
     hans
     max
     susi
    (3 Zeilen)
    
    test=*# select * from telefon;
     name | nummer
    ------+--------
     hans | 123
     hans | 345
     max  | 1234
     max  | 2345
     max  | 3456
     susi | 1
     susi | 2
     susi | 3
     susi | 4
    (9 Zeilen)
    
    dann suchst Du wohl:

    Code:
    test=*# select name, string_agg(t1,'') as telefon_1, string_agg(t2,'') as telefon_2, string_agg(t3, '') as telefon_3 from (select name, case when r=1 then nummer else '' end as t1, case when r=2 then nummer else '' end as t2, case when r=3 then nummer else '' end as t3 from ansprechpartner right join (select *, row_number() over (partition by name) as r from telefon where name in (select name from telefon group by name having count(*) = 3)) t using (name)) foo group by name;
     name | telefon_1 | telefon_2 | telefon_3
    ------+-----------+-----------+-----------
     max  | 1234  | 2345  | 3456
    (1 Zeile)
    
    PostgreSQL, sollte sich aber an M$SQL anpassen lassen.
     
  6. ukulele

    ukulele Datenbank-Guru

    Jein. Mit XML müsste man string_agg() imitieren und den String dann zerlegen. Geht, kann man machen, finde ich aber weniger elegant weil man mit Strings rum puzzelt.

    Es gibt vermutlich einige Lösungen (auch mit PIVOT), ist also eine Frage der Präferenz.
     
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