Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL-Anweisung zum Verbinden und Geben des Ergebnisses in mehreren Spalten

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