Du har brug for en PIVOT-funktion med dynamisk kolonnedefinition. Den enkleste måde er 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)
)
Når du skal behandle XML-data:
<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
understøtter definition af dynamiske kolonner (for source in (select distinct t.source from tst_data t)
), men det returnerer XML-data. Extractvalue
og xmltable
funktioner tillader at forespørge bestemte kolonner fra XML på serversiden, men du skal angive feltnavne på forhånd. Så jeg går ud fra at analysere det på klientsiden.
Hvis du vil gøre alt på DB-lag, er der en anden tilgang. PIVOT
(ikke XML) kræver kolonnenavne for source in ('INTERNET', 'DEMO', 'COM', ...)
. Det er muligt at generere en sådan forespørgsel og returnere en markør til klientsiden:
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;
Jeg kender ikke nogen metode til at oprette en simpel utypeforespørgsel fra markøren (på serversiden), så hvis du ønsker at bruge en almindelig SQL-forespørgsel, gør det i to trin:
- Generer en PIVOT-forespørgsel med navngivne kolonner i PL/SQL-funktionen;
- Kør forespørgslen fra din klient.