mehrere Zeilen in Spalten ausgeben

Thomas

Neuer Benutzer
Beiträge
2
Hallo zusammen,
ich bin nicht gerade Experte und eher so der lerning-by-doing-Typ, daher seht es mir bitte nach, wenn das hier nicht so ganz sauber formuliert ist ;o)!

Ich nutze eine Tabelle mit verschiedenen Kontaktdaten und -wegen zu bestimmten Personen. Die Tabelle ist so aufgebaut, dass für jeden Kontaktweg eine Zeile vorhanden ist. Wenn für die Person also mehrere Kontaktwege vorhanden sind, gibt es zu der Person mehrere Datensätze in der Tabelle (z.B. zwei Telefonnummer und zwei E-Mail-Adressen => 4 Datensätze).
Z.B.:
Personen_IDlfd_NrKontaktartText
123456​
1​
Telefon0171123456
123456​
4​
Telefon04444987658
123456​
8​
E-Mailmax_muster@web.de
123456​
9​
E-Mailmax.muster@arbeitergeber.de

Daraus möchte ich gerne zu folgendem Ergebnis kommen:
Personen_IDKontakt_2Kontakt_2Kontakt_3Kontakt_4
123456​
017112345604444987658max_muster@web.demax.muster@arbeitergeber.de

Es ist leider nicht so, dass es zu jeder Person die gleich Anzahl an Kontakten gibt. Auch die lfd. Nr. der Kontakte ist nicht fortlaufend (dazwischen gibt es alte, gelöschte Datensätze). Und ganz blöd: ich habe sogar Fälle gefunden, in denen bei derselben Person dieselbe laufende Nummer doppelt vorkam.

Hat vielleicht jemand eine Idee, wie ich zu meinem Wunschergebnis komme?

Vielen lieben Dank!

Thomas
 
Werbung:
Ich würde raten, mt mehreren Tabellen zu arbeiten.
1.: Tabelle Personen
2.: Tabelle Kontaktmöglichkeiten

Die Tabelle Personen enthält: ID, Name
Die Tabelle Kontaktmöglichkeiten enthält: Person (bezogen auf die Tabelle Personen mit einem Foreign Key) sowie die Kontaktart und die entsprechende Adresse.
Wenn du es wirklich schön machen willst, vl sogar noch eine Tabelle mit den diversen Kontaktarten, und ebenfalls als Foreign Key in die Tabelle Kontaktmöglichkeiten einbinden.

mir ist bei meiner Arbeit schon öfters aufgefallen, dass ich zu wenig Tabellen erstelle, um schneller damit arbeiten zu können.
EDIT: wenn du es tatsächlich umbedngt auf deine Art lösen möchtest, es ist mit subselects möglich...
Beispiel (andere Tabelle):
Code:
select (select personen_id from x where personen_id = 1), (select kontaktx from x where personen_id = 1), (select .....);
 
Das wird so nix. Du kannst die Kontaktwege z.B. via Komma aggregieren, das ist kein Ding. Aber eine Abfrage, wo bei der Erstellung icht klar ist, wie viele Spalte das Ergebnis haben wird - das wird nix.
 
Daraus möchte ich gerne zu folgendem Ergebnis kommen
Wie soll das Ergebnis verwendet werden?
- Als neue Tabelle? Die u.U. im System sogar weiter verwendet wird?
- Als Ausgabe / Report?

Der erste Fall ist nichts, was man in einer DB machen will, sollte und ohne Einschränkungen bei der Erstellung auch nicht kann. Der Nutzen systemintern ist auch sehr beschränkt, die Qualen in der Weiterverwendung hoch.
Der zweite Fall könnte als Report erfolgen oder wie von akretschmer geschrieben, Komma getrennt.

Was Du möchtest nennt Kreuztabelle oder Pivot, Oracle hat dafür SQL Funktionen, aber man will bzw. kann es zumindest in der offenen Variante gar nicht. SQL braucht eine fest vorgegebene Spaltendefinition.
 
Wenn du schon sagst das lfd. Nr. doppelt sind hast du quasi Inkonsistenzen, auch wenn die lfd. Nr. für dein Vorhaben eigentlich nicht relevant ist.
Ich würde raten, mt mehreren Tabellen zu arbeiten.
1.: Tabelle Personen
2.: Tabelle Kontaktmöglichkeiten

Die Tabelle Personen enthält: ID, Name
Die Tabelle Kontaktmöglichkeiten enthält: Person (bezogen auf die Tabelle Personen mit einem Foreign Key) sowie die Kontaktart und die entsprechende Adresse.
Das ist quasi der Fall? Gezeigt wird nur die Tabelle 2, Personen ID ist der FK auf Personen.

Das mit den inkonsistenten lfd. Nummern ist nicht schön aber die Spalte ist theoretisch nicht relevant. Eine unbekannte Anzahl von Spalten ist wie schon beschrieben ein Problem, leider kenne ich Oracle jetzt nicht aber mit einer Spalte pro Kontaktart und dann mit Komma-separierten Werten sollte kein Problem sein.
 
Die Frage ist: was hast du dem Ergebnis vor? Zur Anzeige ist es ja nicht gerade geeignet, also gehe ich davon aus das du es eh weiter bearbeiten willst. In dem Fall wäre z.B. ein JSON object welches eine Array enthält mit allen Kontakten wesentlich sinnvoller
 
Sorry, war eine Weile nicht da.
Ich danke Euch allen für Eure Tipps!
Eine echte Lösung habe ich leider nicht hinbekommen, mein Abnehmer musste nun damit leben, dass er je Person evtl. mehrere Datensätze im Report hat.

Vielen Dank und viele Grüße

Thomas
 
Werbung:
baue dir doch den Report selber mir PLSQL
habe das mal Rasch zusammen gezimmert

HTML:
sql abfrage select * from Kontakte where ...

loop
 htp.p('<table class="t-Report-report">');
 htp.p('    <tr>');
 htp.p('        <td>tel1</td>');
     IF Telefonnummer  IS NOT NULL then
 htp.p('        <td>tel2</td>');
     end if;
 htp.p('        <td>tel3</td>');
 htp.p('    </tr>');
 htp.p('    <tr>');
 htp.p('        <td>Wert 1</td>');
   IF Telefonnummer  IS NOT NULL then
 htp.p('        <td>wert 2</td>');
  end if;
 htp.p('        <td>wert 3</td>');
 htp.p('    </tr>');
 htp.p('</table>');
 
Zuletzt bearbeitet:
Zurück
Oben