Có một vài cách mà bạn có thể thực hiện chuyển đổi dữ liệu này. Bạn có quyền truy cập vào PIVOT
hàm thì đó sẽ là cách dễ nhất, nhưng nếu không thì bạn có thể sử dụng hàm tổng hợp và a CASE
.
Phiên bản tổng hợp / trường hợp:
select personid,
max(case when optionid = 'A' then 1 else 0 end) OptionA,
max(case when optionid = 'B' then 1 else 0 end) OptionB,
max(case when optionid = 'C' then 1 else 0 end) OptionC
from PersonOptions
group by personid
order by personid;
Xem SQL Fiddle với bản demo
Pivot tĩnh:
select *
from
(
select personid, optionid
from PersonOptions
) src
pivot
(
count(optionid)
for optionid in ('A' as OptionA, 'B' OptionB, 'C' OptionC)
) piv
order by personid
Xem SQL Fiddle với bản demo
Phiên bản động:
Hai phiên bản trên hoạt động rất tốt nếu bạn có số lượng giá trị đã biết, nhưng nếu giá trị của bạn không xác định, thì bạn sẽ muốn triển khai sql động và trong Oracle, bạn có thể sử dụng quy trình:
CREATE OR REPLACE procedure dynamic_pivot_po(p_cursor in out sys_refcursor)
as
sql_query varchar2(1000) := 'select personid ';
begin
for x in (select distinct OptionID from PersonOptions order by 1)
loop
sql_query := sql_query ||
' , min(case when OptionID = '''||x.OptionID||''' then 1 else null end) as Option_'||x.OptionID;
dbms_output.put_line(sql_query);
end loop;
sql_query := sql_query || ' from PersonOptions group by personid order by personid';
dbms_output.put_line(sql_query);
open p_cursor for sql_query;
end;
/
Sau đó, bạn trả lại kết quả, bạn sẽ sử dụng:
variable x refcursor
exec dynamic_pivot_po(:x)
print x
Kết quả giống nhau với tất cả các phiên bản:
| PERSONID | OPTIONA | OPTIONB | OPTIONC |
------------------------------------------
| 1 | 1 | 1 | 0 |
| 2 | 0 | 0 | 1 |
| 3 | 0 | 1 | 0 |
| 4 | 1 | 0 | 1 |