Abfrageergebnisse konkatinieren

Guten Tag,

ich möchte mehrere Ergebnisse einer Abfrage konkatiniert in einer Zelle ausgeben (lassen).

Beispiel :
Ein Kunde kann mehrere Autos gekauft haben.
Diese sollen nun nebeneinander in einer Zelle ausgegeben werden.

Select
Kunde
,gekauftes_Auto
from
Tabellle

Ursprung:
Kunde Auto
Müller BMW M3
Müller Opel Zafira

gewünschte Ausgabe:

Kunde gekaufte Autos
Müller BMW M3 Opel Zafira …

Vielen Dank im Voraus.

Gruß
Flons

Hallo Flons,

wie schon mehrmals auf dieser Liste diskustiert (s. Archiv), ist die Transponierung nur möglich, wenn man weiss wieviele Möglichkeiten es gibt.

MfG Georg V.

Hallo und vielen Dank erst einmal.

Über die Möglichkeit, dies statisch und evtl. über Unterabfragen zu lösen, weiß ich bescheid.

Allerdings kann sich die „Automarke“ ja ändern oder es kommen neue Modelle hinzu.
Damit wäre die Abfrage dann nicht mehr aktuell und die neuen Modelle würden nicht mehr erfasst werden.

Gäbe es evtl. (eine) Möglichkeit(en), dies über PL/SQL zu lösen??

Danke nochmals.

Gruß
Flons

Welche DB benutzt du denn ? ich tippe mal auf Oracle und da kannst du es so machen :

select
deptno,
xmltransform
(
sys_xmlagg
(
sys_xmlgen(ename)
),
xmltype
(
‚<?xml version="1.0"?>;‘
)
).getstringval() listagg
from scott.emp
group by deptno
/

(…für das SCOTT/TIGER Beispiel Schema,musst du anpassen)

  • Dies läuft ab Oracle 9iR2
  • ist „dynamisch“

Gruss

Hallo und vielen Dank erst einmal.

Leider verstehe ich das Statement (noch) nicht so ganz.
Ich werde mich da erst einmal intensiver mit befassen müssen.

Danke und Gruß
Flons

Hi Flons,

Leider verstehe ich das Statement (noch) nicht so ganz.

das tue ich auch nicht, mir scheint aber daß man Dich falsch verstanden hat.
So weit ich das sehe (habe auch nur Oracle Grundkenntnisse) hat Dir Ulrich Vaid eine (sehr interessante!) Lösung zur Transponation geboten (Lieber Ulrich, korrigier mich bitte, falls ich in meiner Vermutung falsch liege!).
So wie ich Dein Problem verstehe brauchst Du aber (wie der Titel schon sagt) eine Konkatenierung aller gekauften Autos eines Kunden in einer Zeile.

Gäbe es evtl. (eine) Möglichkeit(en), dies über PL/SQL zu lösen??

Ja, z.B. so:

DECLARE

 CURSOR c\_kunden IS
 SELECT DISTINCT (kunde)
 FROM tabellle
 WHERE kunde IS NOT NULL;

 CURSOR c\_tabellle IS
 SELECT kunde, gekauftes\_auto
 FROM tabellle
 WHERE gekauftes\_auto IS NOT NULL
 GROUP BY kunde, gekauftes\_auto;

 r\_kunden c\_kunden%ROWTYPE;
 r\_tabellle c\_tabellle%ROWTYPE;

 v\_gekaufte\_autos VARCHAR2 (9999);
 v\_erste BOOLEAN;

BEGIN

 DBMS\_OUTPUT.ENABLE (1000000);

 FOR r\_kunden IN c\_kunden LOOP
 v\_gekaufte\_autos := '';
 v\_erste := TRUE;

 FOR r\_tabellle IN c\_tabellle LOOP
 IF (r\_kunden.kunde = r\_tabellle.kunde) THEN
 IF (v\_erste = TRUE) THEN
 v\_gekaufte\_autos := r\_tabellle.gekauftes\_auto;
 v\_erste := FALSE;
 ELSE
 v\_gekaufte\_autos := v\_gekaufte\_autos || ',' || r\_tabellle.gekauftes\_auto;
 END IF;
 END IF;
 END LOOP;

 -- Hier dein nun Dein Code ... 
 -- aktueller Kunde: r\_kunden.kunde
 -- konkatenierte Autos: v\_gekaufte\_autos

 -- Z.B. Ausgabe auf STDOUT
 DBMS\_OUTPUT.PUT\_LINE (r\_kunden.kunde || ':' || v\_gekaufte\_autos);
 END LOOP;

END;
/

Hoffe ich konnt Dir damit helfen.

Gruß,
Luke

Hi Flons,

Leider verstehe ich das Statement (noch) nicht so ganz.

das tue ich auch nicht, mir scheint aber daß man Dich falsch
verstanden hat.
So weit ich das sehe (habe auch nur Oracle Grundkenntnisse)
hat Dir Ulrich Vaid eine (sehr interessante!) Lösung zur
Transponation geboten (Lieber Ulrich, korrigier mich bitte,
falls ich in meiner Vermutung falsch liege!).
Gruß,
Luke

Hi Luke,

Du liegst falsch :smile:

Beispiel (Mit dem „Datenmodel“ des OP, welches ich so natürlich eher nicht machen würde…)

–Create Table

CREATE TABLE dev_examples.kunde_autos (
kunde VARCHAR2 (10),
autos VARCHAR2 (10)
)
/

–Insert some Stuff…

INSERT INTO kunde_autos
VALUES (
‚müller‘, ‚bmw‘
);

INSERT INTO kunde_autos
VALUES (
‚müller‘, ‚mercedes‘
);

INSERT INTO kunde_autos
VALUES (
‚müller‘, ‚honda‘
);

INSERT INTO kunde_autos
VALUES (
‚meier‘, ‚mercedes‘
);

INSERT INTO kunde_autos
VALUES (
‚meier‘, ‚rostkiste‘
);

INSERT INTO kunde_autos
VALUES (
‚schmid‘, NULL
);

Commit;

SELECT a.kunde, a.autos
FROM kunde_autos a;

KUNDE AUTOS

müller bmw
müller mercedes
müller honda
meier mercedes
meier rostkiste
schmid

–und nun das PIVOT:

select
kunde,
xmltransform
(
sys_xmlagg
(
sys_xmlgen(autos)
),
xmltype
(
‚<?xml version="1.0"?>;‘
)
).getstringval() listagg
from kunde_autos
group by kunde
/
–Ergebnis :

KUNDE LISTAGG

meier mercedes;rostkiste;
müller bmw;mercedes;honda;
schmid

Gruss

Vielen Dank!
Vielen Dank für Eure Antwort(en)!

Ich werde die Möglichkeiten morgen ausprobieren.

Vielen Dank noch einmal.
Gruß
Flons