Potrzebujesz funkcji PRZESTAWNE z definicją kolumn dynamicznych. Najprostszym sposobem jest 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)
)
Po przetworzeniu danych 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
obsługuje definicję kolumn dynamicznych (for source in (select distinct t.source from tst_data t)
), jednak zwraca dane XML. Extractvalue
i xmltable
funkcje pozwalają odpytywać poszczególne kolumny z XML-a po stronie serwera, ale należy wcześniej określić nazwy pól. Więc zakładam, że analizuję to po stronie klienta.
Jeśli chcesz zrobić wszystko na warstwie DB, jest inne podejście. PIVOT
(nie XML) wymaga nazw kolumn for source in ('INTERNET', 'DEMO', 'COM', ...)
. Możliwe jest wygenerowanie takiego zapytania i zwrócenie kursora po stronie klienta:
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;
Nie znam żadnej metody tworzenia prostego, niewpisanego zapytania z kursora (po stronie serwera), więc jeśli chcesz użyć zwykłego zapytania SQL, zrób to w dwóch krokach:
- Generuj zapytanie PIVOT z nazwanymi kolumnami w funkcji PL/SQL;
- Uruchom zapytanie od swojego klienta.