Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Instrukcja SQL do połączenia i uzyskania wyniku w wielu kolumnach

Nie określiłeś RDBMS, ale jest to w zasadzie pivot jeśli Twoja baza danych ma dostęp do tej funkcji. Jeśli nie, możesz wykonać replikację za pomocą case i funkcja agregująca.

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

Zobacz Skrzypce SQL z wersją demonstracyjną

W SQL Server i Oracle PIVOT funkcja istnieje:

Serwer 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

Zobacz Skrzypce SQL z wersją demonstracyjną

Możesz tworzyć wersje dynamiczne, jeśli masz nieznaną liczbę kwot, które chcesz zamienić w kolumny.

Edytuj, stwierdziłeś, że korzystasz z Oracle, więc odpowiedzi dotyczące Oracle znajdują się poniżej:

Wyrocznia 11g ma pivot funkcja:

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

Zobacz Skrzypce SQL z wersją demonstracyjną

Jeśli nie korzystasz z Oracle 11g, musisz użyć CASE z funkcją agregującą:

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

Zobacz Skrzypce SQL z wersją demonstracyjną



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Automatyczne wymuszanie maksymalnego rozmiaru tabeli bazy danych przez usunięcie starych wierszy

  2. Jak ustawić limit czasu połączenia Oracle db w aplikacji Spring Boot?

  3. Dlaczego nie możemy użyć silnego kursora ref z dynamiczną instrukcją SQL?

  4. Funkcje daty i godziny Oracle (pełna lista)

  5. Funkcja SYSDATE w Oracle