Sie haben das RDBMS nicht angegeben, aber dies ist im Grunde ein pivot
wenn Ihre Datenbank Zugriff auf diese Funktion hat. Wenn nicht, dann können Sie mit einem case
replizieren und eine Aggregatfunktion.
MySQL :
select name,
sum(case when group_rn = 1 then amount else 0 end) Amount1,
sum(case when group_rn = 2 then amount else 0 end) Amount2,
sum(case when group_rn = 3 then amount else 0 end) Amount3
from
(
select name,
@num := if(@name = `name`, @num + 1, 1) as group_rn,
@name := `name` as dummy,
amount
from
(
select p.name,
d.amount,
d.decl_id
from person p
inner join declaration d
on p.person_id = d.person_id
) src
order by name
) p
group by name
Siehe SQL Fiddle mit Demo
In SQL Server und Oracle der PIVOT
Funktion existiert:
SQL-Server :
select name,
[1] as Amount1,
[2] as Amount2,
[3] as Amount3
from
(
select p.name,
d.amount,
row_number() over(partition by p.name order by d.amount) rn
from person p
inner join declaration d
on p.person_id = d.person_id
) src
pivot
(
sum(amount)
for rn in ([1], [2], [3])
) p
Siehe SQL-Fiddle mit Demo
Sie können dynamische Versionen erstellen, falls Sie eine unbekannte Anzahl von Beträgen haben, die Sie in Spalten umwandeln möchten.
Bearbeiten, Sie haben angegeben, dass Sie Oracle verwenden, daher finden Sie unten orakelspezifische Antworten:
Orakel 11g hat den pivot
Funktion:
select name,
Amount1,
Amount2,
Amount3
from
(
select p.name,
d.amount,
row_number() over(partition by p.name order by d.amount) rn
from person p
inner join declaration d
on p.person_id = d.person_id
) src
pivot
(
sum(amount)
for rn in ('1' as Amount1, '2' as Amount2, '3' as Amount3)
) p
Siehe SQL-Fiddle mit Demo
Wenn Sie nicht Oracle 11g verwenden, müssen Sie einen CASE
verwenden mit Aggregatfunktion:
select name,
sum(case when rn = 1 then amount else 0 end) Amount1,
sum(case when rn = 2 then amount else 0 end) Amount2,
sum(case when rn = 3 then amount else 0 end) Amount3
from
(
select p.name,
d.amount,
row_number() over(partition by p.name order by d.amount) rn
from person p
inner join declaration d
on p.person_id = d.person_id
) src
group by name
Siehe SQL-Fiddle mit Demo