sql >> Databáze >  >> RDS >> Oracle

SQL příkaz ke spojení a poskytnutí výsledku ve více sloupcích

Neuvedli jste RDBMS, ale toto je v podstatě pivot pokud má vaše databáze přístup k této funkci. Pokud ne, můžete replikovat pomocí case a agregační funkce.

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

Viz SQL Fiddle s ukázkou

V SQL Server a Oracle PIVOT funkce existuje:

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

Viz SQL Fiddle s ukázkou

Můžete vytvořit dynamické verze v případě, že máte neznámý počet částek, které chcete převést do sloupců.

Upravte, uvedli jste, že používáte Oracle, takže odpovědi specifické pro Oracle jsou níže:

Oracle 11g má pivot funkce:

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

Viz SQL Fiddle s ukázkou

Pokud nepoužíváte Oracle 11g, budete muset použít CASE s agregační funkcí:

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

Viz SQL Fiddle s ukázkou



  1. Jak mohu sdružit připojení pomocí psycopg a gevent?

  2. Návrh databáze pro vytváření tabulek za chodu

  3. Kód VBA pro načítání dat z Mysql DB v Mac Excel 2011

  4. Proměnné relace vs. tabulka Mysql