Oracle SQL: Zeilen in Spalten aufteilen

Hallo,

ich möchte eine Tabelle, die zwei Spalten und drei Zeilen hat, in eine Tabelle mit einer Zeile und vier Spalten aufteilen:

Ur-Tabelle:

NR || BEZ

4711 || Haus
4711 || Hund
4711 || Rose

Zu erzeugende Tabelle:

NR || BEZ1 || BEZ2 || BEZ3

4711 || Haus || Hund || Rose

Kann jemand beim SQL-Befehl helfen?

Danke

mlyxs

Ur-Tabelle:

NR || BEZ
--------------
4711 || Haus
4711 || Hund
4711 || Rose

Hallo mlyxs,

und die Ursprungstabelle hat keinerlei identifizierte Nummer für die drei Begriffe? Dann wird es sehr, sehr teuer und eigentlich nur lösbar, wenn Du eine alphabetische Sortierung akzeptierst.

Vorgehensweise: Schaffe dir drei „Views“, die den einzelnen Begriffen eine Wertigkeit zuordnet (z.B.):

create view view1\_ur\_tabelle
select NR, 1 as wert, min(bez) as bez
 from ur\_tabelle
 group by Nr, 1

create view view3\_ur\_tabelle
select NR, 3 as wert, max(bez) as bez
 from ur\_tabelle
 group by Nr, 3

select Nr, 2 as wert, bez
 from ur-tabelle
 where bez not in (select bez 
 from view3\_ur\_tabelle
 union
 select bez 
 from view1\_ur\_tabelle
 )

und gruppiere diese Werte dann nach den Wert 1,2 und 3

select Nr, max(decode(wert,1,bez1,'')), 
 max(decode(wert,2,bez2,'')), , max(decode(wert,3,bez3,''))
 from (
 select Nr,wert,bez as bez1,'' as bez2,'' as bez3 
 from view1\_ur\_tabelle
 union
 select Nr,wert,'', bez,'' 
 from view2\_ur\_tabelle
 union
 select Nr,wert,'','', bez 
 from view3\_ur\_tabelle
 )
 group by Nr

Dies ist aus dem Bauch herausgetippt, also keine Verantwortung für Fehler und schon gar nicht bzgl Performance.

MfG Georg V.

Hi!

Genau NUR für diesen Fall (also mit 3 Zeilen):

select a.nr,a.bez,b.bez,c.bez
 from urtabelle a
 ,urtabelle b
 ,urtabelle c
 where a.nr = b.nr
 and b.nr = c.nr

Ich persönlich würde das Ganze eher prozedural lösen …

Grüße,
Tomh

Hallo zusammen,

vielen Dank für die Antworten,

hier die Lösung:

3 Views erzeugen:
create view view1_ur_tabelle as
select NR, 1 as wert, min(bez) as bez
from ur_tabelle
group by Nr, 1

create view view3_ur_tabelle as
select NR, 3 as wert, max(bez) as bez
from ur_tabelle
group by Nr, 3

create view view2_ur_tabelle as
select Nr, 2 as wert, bez
from ur-tabelle
where bez not in (select bez
from view3_ur_tabelle
union
select bez
from view1_ur_tabelle
)

Abfrage:
select Nr, max(decode(wert,1,bez1,’’)),

max(decode(wert,2,bez2,’’)), , max(decode(wert,3,bez3,’’))

from (

select Nr,wert,bez as bez1,’’ as bez2,’’ as bez3

from view1_ur_tabelle

union

select Nr,wert,’’, bez,’’

from view2_ur_tabelle

union

select Nr,wert,’’,’’, bez

from view3_ur_tabelle

)

group by Nr

Gruß mlyxs

Hallo Tomh,

nicht ganz richtig, hier fehlen einige where-Bedingungen. So bekommst Du auch die Kombinationen:

Hund, Hund, Hund
Hund, Hund, Haus
....

MfG Georg V.

Hi!

nicht ganz richtig, hier fehlen einige where-Bedingungen.

Ich wollte Euch nur testen, ob ihr auch mitdenkt :wink:

Ich habs jetzt sogar ausprobiert (mit einer erweiterten WHERE-Clause, in der die ROWIDs verglichen werden), und sogar das paßt noch nicht (da ich alle möglichen Kombinationen bekomme …

Ich plädiere noch immer für die prozedurale Lösung (es ist Freitag und die Sonne scheint und ich quäle mich gerade mit ein paar Anwendern ab … )

Grüße,
Tomh