Es gibt verschiedene Möglichkeiten, wie Sie diese Datenumwandlung durchführen können. Sie haben Zugriff auf die PIVOT
Funktion, dann ist dies die einfachste. Wenn nicht, können Sie eine Aggregatfunktion und eine verwenden CASE
.
Aggregat / Fallversion:
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;
Siehe SQL Fiddle with Demo
Statischer Drehpunkt:
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
Siehe SQL Fiddle with Demo
Dynamische Version:
Die beiden obigen Versionen funktionieren hervorragend, wenn Sie eine bekannte Anzahl von Werten haben, aber wenn Ihre Werte unbekannt sind, möchten Sie dynamisches SQL implementieren und in Oracle können Sie eine Prozedur verwenden:
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;
/
Dann geben Sie die Ergebnisse zurück und verwenden:
variable x refcursor
exec dynamic_pivot_po(:x)
print x
Die Ergebnisse sind bei allen Versionen gleich:
| PERSONID | OPTIONA | OPTIONB | OPTIONC |
------------------------------------------
| 1 | 1 | 1 | 0 |
| 2 | 0 | 0 | 1 |
| 3 | 0 | 1 | 0 |
| 4 | 1 | 0 | 1 |