Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Câu lệnh SQL để nối và đưa ra kết quả trong nhiều cột

Bạn không chỉ định RDBMS, nhưng về cơ bản đây là một pivot nếu cơ sở dữ liệu của bạn có quyền truy cập vào chức năng đó. Nếu không, bạn có thể sao chép bằng case và một hàm tổng hợp.

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

Xem SQL Fiddle with Demo

Trong SQL Server và Oracle, PIVOT chức năng tồn tại:

Máy chủ 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

Xem SQL Fiddle with Demo

Bạn có thể tạo các phiên bản động, trong trường hợp bạn có một số lượng không xác định mà bạn muốn chuyển thành cột.

Chỉnh sửa, bạn đã nói rằng bạn đang sử dụng Oracle, vì vậy các câu trả lời cụ thể của oracle ở bên dưới:

Oracle 11g có pivot chức năng:

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

Xem SQL Fiddle with Demo

Nếu bạn không sử dụng Oracle 11g, thì bạn sẽ cần sử dụng CASE với chức năng tổng hợp:

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

Xem SQL Fiddle with Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tồn tại trong con trỏ nơi đáp ứng điều kiện

  2. Lỗi trong quy trình được lưu trữ của Oracle

  3. Oracle SQL tạo đầu ra ngẫu nhiên với các thẻ danh sách

  4. Mã hóa / giải mã mật khẩu trong hàm Oracle

  5. Trả về giá trị boolean từ hàm oracle