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
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
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
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