Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL израз за обединяване и даване на резултат в множество колони

Не сте посочили RDBMS, но това е основно pivot ако вашата база данни има достъп до тази функция. Ако не, тогава можете да копирате, като използвате case и агрегатна функция.

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

Вижте SQL Fiddle с демонстрация

В SQL Server и Oracle PIVOT съществува функция:

SQL сървър :

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

Вижте SQL Fiddle с демонстрация

Можете да създадете динамични версии, в случай че имате неизвестен брой суми, които искате да превърнете в колони.

Редактирайте, казахте, че използвате Oracle, така че конкретните отговори за Oracle са по-долу:

Оракул 11g има pivot функция:

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

Вижте SQL Fiddle с демонстрация

Ако не използвате Oracle 11g, тогава ще трябва да използвате CASE с агрегатна функция:

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

Вижте SQL Fiddle с демонстрация



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. клауза съюз в sql

  2. Можем ли да имаме множество WITH AS в един sql - Oracle SQL

  3. Защо тази проверка за нулев асоциативен масив в PL/SQL е неуспешна?

  4. Пресъздайте лош RAC възел

  5. Как да пишем обекти с малки букви в база данни на Oracle?