SELECT: Mehrere Zeilen zusammenfassen

Armas

Neuer Benutzer
Beiträge
2
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
 
Werbung:
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 :)
 
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.
 
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.
 
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.
 
Werbung:
Zurück
Oben