Mehrere Zeilen zu einer Zeile zusammenfassen - per SQL (ohne 11g LISTAGG)
Immerwieder gebraucht: Mehrere Zeilen einer Abfrage zu einer Liste zusammenzufassen.
Eine Lösung per SQL:
Liefert als Ergebnis:
Aufbau des Statements:
simuliert eine Tabelle mit 8 Zeilen
Eine Lösung per SQL:
select fall, MAX(LTRIM(sys_connect_by_path(TXT,', '),', ')) liste from (
select fall
, row_number() over (partition by fall order by fall) zeile
, nr, txt from
(
select 1 fall, 11 Nr, 'Txt 1A' Txt from dual
union all
select 1 fall, 12, 'Txt 1B' from dual
union all
select 1 fall, 13, 'Txt 1C' from dual
union all
select 1 fall, 14, 'Txt 1D' from dual
union all
select 2 fall, 15, 'Txt 2A' from dual
union all
select 2 fall, 16, 'Txt 2B' from dual
union all
select 2 fall, 17, 'Txt 2C' from dual
union all
select 2 fall, 18, 'Txt 2D' from dual
)
)
start with zeile = 1
connect by fall = PRIOR fall and prior zeile = zeile -1
group by fall
;
select fall
, row_number() over (partition by fall order by fall) zeile
, nr, txt from
(
select 1 fall, 11 Nr, 'Txt 1A' Txt from dual
union all
select 1 fall, 12, 'Txt 1B' from dual
union all
select 1 fall, 13, 'Txt 1C' from dual
union all
select 1 fall, 14, 'Txt 1D' from dual
union all
select 2 fall, 15, 'Txt 2A' from dual
union all
select 2 fall, 16, 'Txt 2B' from dual
union all
select 2 fall, 17, 'Txt 2C' from dual
union all
select 2 fall, 18, 'Txt 2D' from dual
)
)
start with zeile = 1
connect by fall = PRIOR fall and prior zeile = zeile -1
group by fall
;
Liefert als Ergebnis:
Fall Liste
1 Txt 1A, Txt 1B, Txt 1C, Txt 1D
2 Txt 2A, Txt 2B, Txt 2C, Txt 2D
2 Txt 2A, Txt 2B, Txt 2C, Txt 2D
Aufbau des Statements:
select 1 fall, 11 Nr, 'Txt 1A' Txt from dual
union all
select 1 fall, 12, 'Txt 1B' from dual
union all
select 1 fall, 13, 'Txt 1C' from dual
union all
select 1 fall, 14, 'Txt 1D' from dual
union all
select 2 fall, 15, 'Txt 2A' from dual
union all
select 2 fall, 16, 'Txt 2B' from dual
union all
select 2 fall, 17, 'Txt 2C' from dual
union all
select 2 fall, 18, 'Txt 2D' from dual
union all
select 1 fall, 12, 'Txt 1B' from dual
union all
select 1 fall, 13, 'Txt 1C' from dual
union all
select 1 fall, 14, 'Txt 1D' from dual
union all
select 2 fall, 15, 'Txt 2A' from dual
union all
select 2 fall, 16, 'Txt 2B' from dual
union all
select 2 fall, 17, 'Txt 2C' from dual
union all
select 2 fall, 18, 'Txt 2D' from dual
simuliert eine Tabelle mit 8 Zeilen
Wunderbar !!!
AntwortenLöschenIch habe es mir zusammengesetzt. Bislang wurde eine Function hierfür genutzt, was das Schreiben (Übergeben) eines SQL-Statements allerdings sehr schwierig macht.
Ich möchte ja stets einen Datenzusammenschluss innerhalb einer Hauptquery wie z. B.:
Zeige den Namen der Person mit der ID = 1 und deren mehrere Eigenschaften an.
D. h., ich muss immer mit einem Subselect arbeiten.
Innerhalb des Subselects kann ich auf die Person_ID der Hauptabfrage Bezug nehmen.
Select Person.Person_ID,
Name,
( zeilen zu Spalte, z. B. mehrere Eigenschaften dieser Person unter Bezug auf die Person_ID Hauptquery )
from Person
where Person_ID = 1 -- (die ID 1 benötige ich für Zeilen_zu_Spalte)
----------
Die reine SQL-Variante ist hier leider (offenbar) nicht möglich, wenn ich z. B. von Person-ID 1 die Wochentage seiner nächsten Termine wissen möchte:
Select Person_ID,
Name, -- nachfolgend aus Termine
-- seine Wochentage
(select Fall, -- 1. Subselect
MAX(LTRIM(sys_connect_by_path
(TXT,', '),', ')) liste from
(select fall, row_number() over....
from -- 2. Subselect
(Select 1 fall, -- 3. Subselect
Person_Termine .. usw.
from Person_Termine
where Person_Termine.Person_ID =
-- (Hauptabfrage)
Person.Person_ID
)
)
from Personen ... usw.
-----------------------------
Möchte ich mehrere Zeilen zu einer Person in eine Spalte packen, so kann ich mich offenbar mit der SQL-Variante nicht auf die ID der Hauptabfrage beziehen, da die Subselects in sich verschachtelt sind.
ORA-00904: "PERSON"."PERSON_ID": ungültiger Bezeichner
Trotzdem ist alles Topp hier!
Diese Seite hebe ich mir auf.
Vielen Dank für die Mühe.
Michael Marschall
Wow, incredible blog layout! How long have you been blogging for?
AntwortenLöschenyou made blogging look easy. The overall look of your web site is magnificent,
as well as the content!
my webpage: buy flat
Wonderful goods from you, man. I have understand your stuff previous to and you are just too wonderful.
AntwortenLöschenI really like what you've acquired here, certainly like what you're
stating and the way in which you say it. You make it enjoyable
and you still take care of to keep it sensible. I can't wait to read much more from you. This is actually a great site.
My web blog ... www.propertywide.co.uk
Fine way of telling, and good piece of writing to obtain information about my presentation topic, which i am going to deliver in school.
AntwortenLöschenCheck out my webpage - http://www.propertywide.co.uk
This paragraph will help the internet viewers for creating new blog
AntwortenLöschenor even a weblog from start to end.
Check out my web blog breaking news