Abfrage Tabelle

Hallo SQL Gemeinde,

ich sitze seit ein paar Tagen an einem Problem wo ich nicht mehr weiterkomme und Hilfe benötige.

Ich habe eine Tabelle mit zwei Feldern (Kundennummer, Zielgruppe)
Jede Kundennummer kann eine oder mehrere Zielgruppen enthalten.
Nun möchte ich die Daten so anzeigen, dass in der ersten Spalte die Kundennummer steht, in der zweiten Spalte die Zielgruppe (Fussball), dann wieder die Spalte Zielgruppe (Handball), usw. Also im Grunde so viele Spalten wie es Zielgruppen gibt (max. 20 Stück).
Gibt es hierfür eine Möglichkeit?

Ich hoffe, dass ich das Problem einigermaßen verständlich dargestellt habe.
Für Lösungen bzw. Vorschläge wäre ich sehr dankbar.

Gruß Kelly

Mindestens 3 Lösungen mit untersch. Aufwand und Resultat. Ich unterstelle mal, daß auch eine Komma-separierte Liste als Ausgabe reicht. Falls nicht, sind es nur 2 Lösungen.

  1. Contrib-Modul crosstab. Erklärung dazu siehe dort.
  2. Comma-Aggregat - Funktion siehe Postgresql information
test=*# select * from kelly ;
 kundennummer | zielgruppe
--------------+------------
            1 | Fussball
            1 | Handball
            2 | Handball
(3 rows)

Time: 0.881 ms
test=*# select Kundennummer, comma(Zielgruppe) from kelly group by Kundennummer;
 kundennummer |       comma
--------------+--------------------
            2 | Handball
            1 | Fussball, Handball
(2 rows)
  1. Conditional Selects, Beispiel:
test=# select Kundennummer, sum(case when Zielgruppe = 'Fussball' then 1 else 0 end) as Fussball, sum(case when Zielgruppe = 'Handball' then 1 else 0 end) as Handball from kelly group by Kundennummer;
 kundennummer | fussball | handball
--------------+----------+----------
            2 |        0 |        1
            1 |        1 |        1
(2 rows)

Such Dir was aus.

Andreas

Hallo Andreas,

vielen, vielen Dank. Das funzt super. Ich hab nur eine Kleinigkeit vergessen zu erwähnen. Was muss ich tun, dass anstatt der 0 oder der 1 die Zielgruppe ausgegeben wird, also bei der Kundennummer wo eine Zielgruppe zugeordnet ist soll auch die Zielgruppe als Name drinstehen, anstonsten soll das Feld leer sein.

Ich habs so probiert. Da krieg ich aber einen Fehler.

SELECT Kundennummer, CASE WHEN Zielgruppe = ‘10’ THEN ‘Fussball’ ELSE ’ ’ END AS Fussball, CASE WHEN Zielgruppe = ‘12’ THEN ‘Handball’ ELSE ’ ’ END AS Handball
FROM Kelly
GROUP BY Kundennummer

Irgend eine Idee?

Kelly

Ist der geheim?

test=*# select kundennummer, case when "Fussball"=1 then 'Fussball' else '' end as "Fussball", case when "Handball" = 2 then 'Handball' else '' end as "Handball" from (select kundennummer, sum(case when zielgruppe='Fussball' then 1 else 0 end) as "Fussball", sum(case when zielgruppe='Handball' then 2 else 0 end) as "Handball" from kelly group by kundennummer order by kundennummer) foo;
 kundennummer | Fussball | Handball
--------------+----------+----------
            1 | Fussball | Handball
            2 |          | Handball
(2 rows)

Das klappt hier aber nur, wenn in der Quelltabelle (kundennummer, zielgruppe) unique sind. Sollte ja aber der Fall sein. Optimierungsmöglichkeit wäre, anstatt ‘Fussball’, ‘Handball’ etc. erst mal nur mit INTs zu arbeiten und die Textdarstellung erst zum Schluß aus einer via FK verbundenen Tabelle zu ziehen.


Andreas