Имате нужда от функция PIVOT с дефиниране на динамични колони. Най-простият начин е pivot xml:
create table tst_data (id int primary key, source varchar2(255));
insert into tst_data values (1, 'INTERNET');
insert into tst_data values (2, 'DEMO');
insert into tst_data values (3, 'INTERNET');
insert into tst_data values (4, 'SALES');
insert into tst_data values (5, 'INTERNET');
insert into tst_data values (6, 'DEMO');
insert into tst_data values (7, 'INTERNET');
insert into tst_data values (8, 'COM');
commit;
select * from (
select source from tst_data
)
pivot xml
(
count(1)
for source in (select distinct t.source from tst_data t)
)
След като трябва да обработите XML данни:
<PivotSet>
<item>
<column name = "SOURCE">COM</column>
<column name = "COUNT(1)">1</column>
</item>
<item>
<column name = "SOURCE">DEMO</column>
<column name = "COUNT(1)">2</column>
</item>
<item>
<column name = "SOURCE">INTERNET</column>
<column name = "COUNT(1)">4</column>
</item>
<item>
<column name = "SOURCE">SALES</column>
<column name = "COUNT(1)">1</column>
</item>
</PivotSet>
PIVOT XML
поддържа дефиниране на динамични колони (for source in (select distinct t.source from tst_data t)
) обаче връща XML данни. Extractvalue
и xmltable
функциите позволяват да се правят заявки за определени колони от XML от страната на сървъра, но трябва да посочите имена на полета предварително. Така че предполагам да го анализирам от страна на клиента.
Ако искате да направите всичко на DB-слой, има друг подход. PIVOT
(не XML) изисква имена на колони for source in ('INTERNET', 'DEMO', 'COM', ...)
. Възможно е да генерирате такава заявка и да върнете курсор към страната на клиента:
CREATE OR REPLACE FUNCTION FUNCTION1 RETURN SYS_REFCURSOR AS
cur sys_refcursor;
BEGIN
open cur for 'select * from dual'; // generate PIVOT query here
RETURN cur;
END FUNCTION1;
Не знам никакъв метод за създаване на проста нетипизирана заявка от курсора (от страната на сървъра), така че ако желаете да използвате обикновена SQL заявка, направете го в две стъпки:
- Генериране на PIVOT заявка с именувани колони в PL/SQL функция;
- Изпълнете заявката от вашия клиент.